块级作用域,变量let,常量const
1由{} 界定的语句就叫做块语句。
1. js中用var声明的变量没有块级的作用域,而是只用函数的作用域和全局的作用域。
var x = 1;
{
var x = 2;
}
console.log(x);
//会输出2,因为块中的var语句与块前面的var语句作用域相同
//在C或Java中,这段代码会输出 1
//这代码证明了var没有块作用域
4. 经典的例子(背住):
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {console.log(i);};
}
a[0](); // 10
a[1](); // 10
a[6](); // 10
/********************/
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {console.log(i);};
}
a[0](); // 0
a[1](); // 1
a[6](); // 6
//第一个中的i是没有块级作用域的,全局只有一个变量i,每次循环的{}中的代码都指向同一个i
//第二个中的i是有块级作用域的,当前的i只在本轮循环有效,每次循环的{}中的代码都指向不同的i
//值得注意的是:for的()是一个父作用域,{}是一个子作用域
//因为当前的i只在本轮循环有效,所以let定义的i在每次循环都会重新定义一遍,每次都是一个新变量
3. 相比之下,使用 let 和 const 声明的变量是有块级作用域的。
let x = 1;
{
let x = 2;
}
console.log(x);
// 输出 1
// x被限制在块级作用域中
// 这里将let换成const结果也一样