关于JavaScript的优点:let比var的优势

Advantages of using let over var within a function

本问题已经有最佳答案,请猛点这里访问。

假设我有一段这样的代码:

1
2
3
4
5
6
7
8
9
10
11
const number = 3;

function fooFunction() {
  let numberTwo = 5;
  var answer = number + numberTwo;
  return answer;
}

finalAnswer = fooFunction();

console.log(finalAnswer);

假设使用ES2015兼容的浏览器,使用上述代码的优势/劣势将超过:

1
2
3
4
5
6
7
8
9
10
11
const number = 3;

function fooFunction() {
  var numberTwo = 5;
  var answer = number + numberTwo;
  return answer;
}

finalAnswer = fooFunction();

console.log(finalAnswer);

如果两者返回相同的数字,有什么优点或缺点吗?

  • 根据这个答案,它们在你的函数中是相同的。
  • 从安全和性能的角度来看呢?
  • 根据你上面的用法,没有区别。
  • 如果在安全性或性能上存在差异,它们将不相同
  • "从安全性和性能的角度看如何?"letvar的区别是范围。不是性能。
  • 它只是作用域(var是函数作用域,让我们来看看块作用域)。编译器将负责提升和优化。
  • 的确。不过,在我看来,let函数更安全,因为在函数之外无法访问数据。这是正确的还是不正确的?如果不是,那为什么不起作用呢?另外,起重是否会影响性能?我本以为会的。
  • var是功能范围,在功能外不可见。let,作为块范围意味着它不一定在整个函数中都可见,但它们都是您的函数的局部…
  • 在您的示例中,var answerfooFunction()块之外不可用。
  • 然而,var变量被提升到功能范围之外,并在全局级别上提供给解释器,而let变量则不是。是不是不对?
  • 不,var被提升到功能的顶部,而不是在功能的外部。)
  • 但是,如果一个let定义的变量在调用它的函数之外仍然没有初始化,这种情况似乎是这样的,那么这比var更安全,因为除了函数本身之外,任何东西都无法访问数据?


正如其他人提到的,在您的示例中,您可以交替使用letvar。区别在于let是块范围的,var不是块范围的。

例如,使用var,您可以这样做(打印"foo"):

1
2
3
4
5
6
7
8
9
function printFoo(param) {
  if (param) {
    var x ="foo";
  }

  console.log(x);
}

printFoo("hello");

由于let x的作用域是if块的作用域,因此没有定义,因此不能使用let来执行此操作。


在您提供的代码示例中,这两个示例可以互换。当let派上用场时,它将范围限制为块级别,而不是功能级别。例如,在for循环的内部使用let

值得注意的是,使用var关键字创建的变量被提升,而使用let关键字创建的变量则没有提升。

凯尔·辛普森在大卫·沃尔什的博客上对这个话题进行了详细的分析:https://david walsh.name/for and against let implicit hazards

  • 从技术上讲,let变量被提升,但不可引用。见暂时死区。In ECMAScript 2015, let will hoist the variable to the top of the block. However, referencing the variable in the block before the variable declaration results in a ReferenceError. The variable is in a"temporal dead zone" from the start of the block until the declaration is processed.
  • (请参见ES6中是否使用let或const声明变量?更详细的讨论)