首页 > 代码库 > JavaScript 变量声明提升

JavaScript 变量声明提升

JavaScript 变量声明提升

一、变量提升的部分只是变量的声明,赋值语句和可执行的代码逻辑还保持在原地不动

二、在基本的语句(或者说代码块)中(比如:if语句、for语句、while语句、switch语句、for...in语句等),不存在变量声明提升

三、函数声明会提升,但是函数表达式的函数体就不会提升

 1  fun();       // hello  2     function fun(){ 3       console.log("hello"); 4     } 5     // -------------- 6     // 提升后 7  8     function fun(){ 9       console.log("hello");10     }11 12     fun();       // hello 

 1  var fun = function(){ 2       console.log("hello"); 3     }; 4  5     // -------------- 6     // 提升后 7  8     var fun; 9 10     fun();        // 报错,TypeError: fun is not a function11 12     fun = function(){13       console.log("hello");14     };

四、如果一个变量和函数同名,函数声明优先于变量声明(毕竟函数是 JavaScript 的第一等公民),并且与函数名同名的变量声明将会被忽略

看几个例题:

第一个: 

1 var foo = 1;2 function bar() {3     if (!foo) {4         var foo = 10;5     }6     alert(foo); //输出为107 }8 bar();

在if语句中(在javascript不能叫块了吧~~),变量不会被提升,因此!foo判断为true,所以输出就为10啦。                                


 第二个:

1 var a = 1;2 function b() {3     a = 10;4     return;5     function a() {}6 }7 b();8 alert(a);  // 1

这是一道神奇的题。第一眼认为输出为10。but,根据第四句话,可以得到:

1 function b() {2   function a() {};//变量提升3   a = 10;4   return;5 }

function a() {} 这种定义方式和 var a = function () {}一样。所以,又可以得到:

1 var a = 1;                 //defines "a" in global scope2 function b() {  3    var a = function () {}; //defines "a" in local scope 4    a = 10;                 //overwrites local variable "a"5    return;      6 }       7 b();       8 alert(a);                 //alerts global variable "a"

1 var a=1;2 (function(){3   a=2;b=2;4 5 })();6 alert(a==b);  //true,作用域的问题,有var和没有var的区别~

JavaScript 变量声明提升