在ES5及其之前的版本中,我们通常使用var声明变量。在使用var声明变量时,需要注意变量的作用域。
当在函数外使用var声明变量时,该变量为全局变量,即便在函数内部使用,它也可以被访问到。例如:
var a = 1;
function test() {
console.log(a);
}
test(); // 1
当在函数内部使用var声明变量时,该变量为函数作用域变量,只能在该函数中访问。例如:
function test() {
var a = 1;
console.log(a);
}
test(); // 1
console.log(a); // Uncaught ReferenceError: a is not defined
在ES6中,引入了let关键字用于声明变量。与var不同的是,使用let声明的变量具有块级作用域。
当在"{}"中使用let声明变量时,该变量只在该作用域中生效。例如:
function test() {
if (true) {
let a = 1;
}
console.log(a);
}
test(); // Uncaught ReferenceError: a is not defined
使用let声明的变量还可以有效避免一些循环带来的问题。例如:
var arr = [];
for (let i = 0; i < 5; i++) {
arr.push(() => console.log(i));
}
arr.forEach((fn) => fn()); // 0, 1, 2, 3, 4
在上述示例中,我们使用let声明循环变量i,使得每次迭代循环时都会创建一个新的变量i。而当在循环结束后调用各个函数时,每个函数的i值都是独立的,因此输出的结果是依次递增的。
通过以上的介绍,我们可以看出var和let的作用域不同,而let的使用能够避免一些常见的编程问题,因此建议对于函数作用域和循环作用域的变量声明,优先使用let关键字进行声明。