📜  “let”和“var”的区别? - Javascript(1)

📅  最后修改于: 2023-12-03 14:48:44.367000             🧑  作者: Mango

'let'和'var'的区别

在JavaScript中,'let'和'var'均用于声明变量。虽然它们在某些方面相似,但它们也有一些重要的区别:

1. 作用域

'var'关键字声明的变量存在函数作用域,而'let'关键字声明的变量存在块作用域。这意味着使用'let'声明的变量只在声明它的块中可用。

function test() {
  var a = 10;
  if (true) {
    var b = 20;
    let c = 30;
  }
  console.log(a); // 10
  console.log(b); // 20
  console.log(c); // 抛出'Uncaught ReferenceError: c is not defined'错误
}
test();

在上面的例子中,变量'a'和变量'b'都是在函数作用域中声明的,因此它们都可以在函数中访问。然而,变量'c'是在块作用域中声明的,因此它只能在其声明的块中访问。

2. 变量提升

使用'var'声明的变量会被提升到函数的顶部,即使它们在声明之前被使用也可以正常工作。这是因为'var'声明的变量存在于整个函数作用域中。

function test() {
  console.log(a); // undefined
  var a = 10;
  console.log(a); // 10
}
test();

在上面的例子中,即使'var a = 10;'在'console.log(a);'之后声明,'a'仍然会被声明并被分配一个值'undefined',所以不会抛出任何错误。

使用'let'关键字声明的变量不会被自动提升,所以如果在声明之前尝试使用'let'声明的变量,会抛出一个错误:

function test() {
  console.log(a); // Uncaught ReferenceError: a is not defined
  let a = 10;
  console.log(a);
}
test();

在上面的例子中,使用'let'声明的变量'a'没有被提升,所以在使用它之前尝试访问它会导致'Uncaught ReferenceError'。

3. 重复声明

在相同作用域内,使用'var'进行重复声明不会导致任何问题。但是,使用'let'进行重复声明将抛出一个错误:

var a = 10;
var a = 20; // 这里没有问题
console.log(a); // 20

let b = 10;
let b = 20; // Uncaught SyntaxError: Identifier 'b' has already been declared
console.log(b);

在上面的例子中,第一个'var'声明不会产生任何问题,但第二个'let'声明会导致一个syntax error。

4. 循环中的变量声明

在使用'let'声明变量的情况下,使用循环声明变量是非常有用的,因为使用'let'声明的变量在每一次迭代中都会重新声明:

for (var i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i); // 输出 5 五次
  }, 1000);
}

for (let j = 0; j < 5; j++) {
  setTimeout(function() {
    console.log(j); // 输出 0 1 2 3 4
  }, 1000);
}

在第一个循环中,因为'var i'变量的存在,所有的迭代都共享同一个变量,因此最终会输出5五次。

在第二个循环中,因为使用'let'声明变量,每个迭代都会重新声明'j',因此每个迭代中的'j'都是独立的,因此最终会输出0 1 2 3 4。

总结

总的来说,使用'let'关键字声明变量是一种更安全、更现代的选择,因为它避免了一些容易犯的错误。然而,如果你需要在整个函数作用域中访问变量,那么使用'var'是合适的。