变量提升
最近发现了一个小问题:
1 2 3 4 5 6 7
| var x="global value"; function getValue(){ alert(x);//undefined var x="local value"; alert(x);//local value } getValue();
|
我们可以发现第一个alert(x)结果为undefined,这就跟JS的变量提升有关系了。
var关键字声明变量,无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部),这就是函数的变量提升。所以上面的代码实际上是:
1 2 3 4 5 6 7 8
| var x="global value"; function getValue(){ var x; //普通的变量初始化就是undefined,所以就好理解了 alert(x); var x="local value"; alert(x); } getValue();
|
下面我们就来整理一下变量提升:
1.我是变量声明,我会被提升在作用域顶端!
2.我是变量定义,我的声明部分会被提升,赋值部分不会被提升!
3.我是函数定义,或者叫我函数表达式。其实我就是变量定义,只不过恰好被赋值的类型是函数,所以也只提升变量名(即提升声明部分),不提升函数值!
1 2 3
| var c=function(){ console.log("test"); }
|
4.我是函数声明,所以我全部被提升了,包括函数名和函数体。另外,我的优先级比变量声明要高,名字和我相同的变量声明会被忽略!
1 2 3
| function d(){ console.log("test"); }
|
最后再补充一点,因为JS虽然有函数作用域,但没有块作用域,即函数中的参数和变量在函数外部是不可见的,而在一个函数内部任何位置定义的变量,在该函数内部任何地方都可见。