参考来源:《你不知道的js》, 《js权威指南》
所有的声明(变量和函数)都会被“移动”到各自作用域的 最顶端,这个过程被称为提升。
- 变量提升
不管变量在哪里声明,执行的时候变量声明一定会被提升到函数体的顶部,举个例子
var scope = "global"
function f() {
console.log(scope) //undefined
var scope = "local"
console.log(scope) //local
}
f()
当函数f执行的时候,相当于
function f() {
var scope
console.log(scope)
scope = "local"
console.log(scope)
}
当执行第一个console.log(scope)的时候,函数作用域中已有声明,就不会再通过作用域链去全局作用域中找,所以第一个输出undefined。
- 函数提升
函数声明和变量声明都会被提升。但是一个值得注意的细节: 函数会首先被提升,然后才是变量。并且,如果有同名变量,以前的会被覆盖掉
举个例子说:
<!--第一次调用-->
foo() //3
var foo;
function foo() {
console.log( 1 );
}
foo = function() {
console.log( 2 );
};
function foo() {
console.log( 3 );
}
<!--第二次调用-->
foo() //2
浏览器就会识别为这样
<!--这个函数把之前的覆盖了,并且函数提升优先变量提升-->
function foo() {
console.log( 3 );
}
<!--第一次调用-->
foo() // 3
<!--再次覆盖-->
foo = function() {
console.log( 2 );
};
<!--第二次调用-->
foo() //2
欢迎提出指正与建议