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 function
11 
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); //输出为10
7 }
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 scope
2 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的区别~
posted @ 2016-09-01 22:19  destinyruru  阅读(310)  评论(0编辑  收藏  举报