先看下面的几个例子:
1.
var a = 99; // 全局变量a
f(); // f是函数,虽然定义在调用的后面,但是函数声明会提升到作用域的顶部。
console.log(a); // a=>99, 此时是全局变量的a
function f() {
console.log(a); // 当前的a变量是下面变量a声明提升后,默认值undefined
var a = 10;
console.log(a); // a => 10
}
// 输出结果:
undefined
10
99
2.
{
var i = 9;
}
console.log(i); // 9
3.
{
let i = 9; // i变量只在 花括号内有效
}
console.log(i); // Uncaught ReferenceError: i is not defined
总结:在ES6中开始用let来定义块级作用域变量,let没有变量的提升,用let声明的变量要求必须等let声明语句执行之后,该变量才能使用不然会报Uncaught ReferenceError 错误,而且let变量不能进行重复声明。