变量提升

先来一个小小的例子吧

a = 2;
var a;
console.log(a);  //2

不是打印 undefined 而是打印 2
这是因为使用var声明的变量是全局性的,存在变量提升。那什么是变量提升呢?
js并不是严格的自上而下的语言,浏览器编译js的时候,会把用var声明的变量提到所有代码前面。然后再执行代码。

所以上面的代码就等同于

var a;
a = 2;
console.log(a);  //2

但是变量提升只提升声明,不会提升赋值。就像下面这个例子一样

console.log(a) //undefined
var a=2

因为var a=2在浏览器解析中是分成这样的两步。var a被提升了,但是a=2还在console后面

var a;
a=2

js除了变量提升,还存在函数提升
函数声明格式:

function 函数名 (参数){
  // 函数体
}

只有使用这种格式声明的函数,才会被函数提升,并且比变量提升位置更加靠前(即同名情况下,给function使用)
变量提升的基本规则:同名情况下,后面的函数声明会覆盖前面的函数声明

看下面一个例子

foo()
var foo = function () {  // 这种格式叫做函数表达式
  console.log("foo")
} //报错,foo is not a function

经过函数提升以后,上面的这段代码变成:

var foo
foo()
foo = function () {
  console.log("foo")
}

所以会报错,foo is not a function。

又一个例子

foo();
function foo() {
    console.log('foo');
}
var foo = 2;

上面的代码,最后会打印 foo。(不存在我们以为的,后声明的会覆盖前面的声明,打印出foo is not a function)

最后补充一下:

a=2
console.log(a)  // 2

可以打印a的值,这是因为不写出声明方式的话,默认是全局变量,用var声明。

你可能感兴趣的:(变量提升)