变量提升

变量提升

  最近发现了一个小问题:

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.我是变量声明,我会被提升在作用域顶端!

1
var a;

2.我是变量定义,我的声明部分会被提升,赋值部分不会被提升!

1
var b="test";

3.我是函数定义,或者叫我函数表达式。其实我就是变量定义,只不过恰好被赋值的类型是函数,所以也只提升变量名(即提升声明部分),不提升函数值!

1
2
3
var c=function(){
console.log("test");
}

4.我是函数声明,所以我全部被提升了,包括函数名和函数体。另外,我的优先级比变量声明要高,名字和我相同的变量声明会被忽略!

1
2
3
function d(){
console.log("test");
}

  最后再补充一点,因为JS虽然有函数作用域,但没有块作用域,即函数中的参数和变量在函数外部是不可见的,而在一个函数内部任何位置定义的变量,在该函数内部任何地方都可见。

文章目录
  1. 1. 变量提升
    1. 1.0.1. 1.我是变量声明,我会被提升在作用域顶端!
    2. 1.0.2. 2.我是变量定义,我的声明部分会被提升,赋值部分不会被提升!
    3. 1.0.3. 3.我是函数定义,或者叫我函数表达式。其实我就是变量定义,只不过恰好被赋值的类型是函数,所以也只提升变量名(即提升声明部分),不提升函数值!
    4. 1.0.4. 4.我是函数声明,所以我全部被提升了,包括函数名和函数体。另外,我的优先级比变量声明要高,名字和我相同的变量声明会被忽略!
,