JavaScript引擎的工做方式是,先解析代码,获取全部被声明的变量,而后再一行一行地运行。这形成的结果,就是全部的变量的声明语句,都会被提高到代码的头部,这就叫作变量提高。函数
示例:code
console.log(a) // undefined var a = 1 function b() { console.log(a) } b() // 1
上面的代码实际执行顺序是这样的:ip
第一步 引擎将var a = 1拆解为var a = undefined和 a = 1,并将var a = undefined放到最顶端,a = 1还在原来的位置;作用域
var a = undefined console.log(a) // undefined a = 1 function b() { console.log(a) } b() // 1
第二步 就是执行,所以js引擎一行一行从上往下执行就形成了当前的结果,这就叫变量提高。io
当前做用域内的声明都会提高到做用域的最前面,包括变量和函数的声明console
(function(){ var a = "1"; var f = function(){}; var b = "2"; var c = "3"; })();
变量a,f,b,c的声明会被提高到函数做用域的最前面,相似以下:function
(function(){ var a,f,b,c; a = "1"; f = function(){}; b = "2"; c = "3"; })();
请注意函数表达式并无被提高,这也是函数表达式与函数声明的区别。进一步看两者的区别:变量
(function(){ //var f1,function f2(){}; //hoisting,被隐式提高的声明 f1(); //ReferenceError: f1 is not defined f2(); var f1 = function(){}; function f2(){} })();
上面代码中函数声明f2被提高,因此在前面调用f2是没问题的。虽然变量f1也被提高,但f1提高后的值为undefined,其真正的初始值是在执行到函数表达式处被赋予的。因此只有声明是被提高的。co