js引擎运行js分为两步: 预解析 和 代码执行
1. 预解析 : js引擎会把js里面所有的var 还有 function 提升到当前作用域的最前面
2. 代码执行 : 按照代码书写的顺序从上往下执行
预解析分为 变量预解析 (变量提升) 和 函数预解析 (函数提升)
1. 变量提升 就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
2. 函数提升 就是把所有的函数声明提升到当前的作用域最前面 不调用函数
下面利用代码来看看变量和函数是怎样提升的:
案例1:
console.log(num); // 执行输出的结果是: undefined
// 上面的代码相当于:
var num; // 变量声明提前
console.log(num); // 声明了一个变量num,但是没有赋值,所以输出是 undefined
//正确的变量声明如下:
var a; // 声明一个变量a
a = 10; // 给变量a赋值
console.log(a) // 变量调用
案例2:
console.log(num); // 输出结果 :undefined
var num = 10;
// 以上代码相当于
var num ; // 变量声明提前,定义一个变量num
console.log(num); // 由于console.log 前面的变量num没有赋值,所以输出 :undefined
num = 10;
案例3:
fn(); // 调用函数 注意:不调用函数,函数不会执行
function fn() {
console.log(11); // 结果输出 :11
} // 这种函数声明方式,调用函数在函数声明前面或者后面都可以
// 一般建议先声明函数后调用 常用这种方式声明函数
案例4:
fun (); // 输出结果 : 报错
var fun = function() {
console.log(22);
}
// 该函数是利用函数表达式进行声明的 调用必须写在函数表达式的下面
// 上面声明函数相当于声明一个变量来理解
console.log (a); // 此时a变量都没有声明,输出是有错的,
var a = 3; // 所以上面函数都没声明就开始调用是错的
案例5:
// var b = 9;
// var c = 9; b 和 c 的声明提前 全局变量
function f1() {
var a = b = c = 9;
// 上面的代码相当于相当于 var a = 9 ; b = 9; c = 9;
// 正确的集体声明为 var a = 9, b = 9, c = 9;
// 所以b 和 c 直接赋值 没有var声明 当全局变量看
console.log(a); // 输出 :9
console.log(b); // 输出 :9
console.log(c); // 输出 :9
}
console.log(b); // 输出 :9 b是全局变量,所以能输出
console.log(c); // 输出 :9 c是全局变量,所以能输出
console.log(a); // 报错 a 在函数f1中声明,属于局部变量,全局区域无法使用变量a
版权声明:本文为weixin_45813597原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。