因为javascript是函数级作用域,在javascript中es6之前都不存在块级作用域,也就是说对于if语句,它不会创建新的作用域,只有函数才会创建新的作用域:
var x = 1;
console.log(x); // 1
if (true) {
var x = 2;
console.log(x); //2
}
console.log(x);// 2
会输出 1 2 2
下面我们开始变量提升和函数提升。
1.javascript中定义的变量或函数会被放在当前作用域的最顶端。
2.提升的仅仅是变量的名字,所赋的值还是没有提升的。
(1)函数表达式(提升失败)
function myTest(){
foo();
var foo =function foo(){
alert("我来自 foo");
}
}
myTest();
(2)函数声明(提升成功)
function myTest(){
foo();
function foo(){
alert("我来自 foo");
}
}
myTest();
只有函数声明的方式才会连函数体一起提升,而函数表达式中只会提升函数名,函数体只有在执行大赋值语句中才会被赋值。