【问题标题】:When should I use let and var? [closed]什么时候应该使用 let 和 var? [关闭]
【发布时间】:2014-03-21 07:08:06
【问题描述】:

编辑:请阅读问题!我已经知道区别了。这不是重复的。

显然,现在我应该始终使用 var 关键字,因为并非所有东西都支持 let

当 let 关键字有更好的支持时(比如说,我在几年内编写了一个使用 Harmony 的 Node 应用程序),我应该在什么时候使用 let 关键字与 var 关键字?

我理解其中的区别——var 用于函数范围,而let 用于块范围——但我正在寻找类似“始终使用 let 关键字”或“使用 var 关键字函数的顶部,但是像 for 循环这样的块中的 let 关键字。

【问题讨论】:

  • 由于实施仍在进行中,我们真的不知道它对性能的影响。
  • 嗯,已经有 2 人冲着回答,懒得看问题了……
  • 人们投票支持将其作为副本关闭。以前没有人问过这个问题——我搜索了一段时间。
  • @victorantunes 这里是对var vs. let 的深入讨论,作者认为 var 是更好的默认值,因此let 的特定用途更加突出。 davidwalsh.name/for-and-against-let

标签: javascript variables ecmascript-harmony ecmascript-6


【解决方案1】:

答案很简单,如果您需要函数范围,请使用var,如果您需要块范围,请使用let

【讨论】:

  • OP 已经提到了。
  • var 仍然适用于范围相当不错
【解决方案2】:

我想说,原则上你应该使用let,只要这样做不方便。如:

for (let i = 0; i < 100; i++) {
    // Do something
}

if (condition) {
    let msg = a + b + c;
    console.log(msg);
    alert(msg);
}

这种方法的优点是:

  1. 将某些全局变量用于其他用途的风险更低
  2. 由于变量在变得无关紧要后长时间保留在内存中,内存泄漏的风险更低

【讨论】:

  • 那些考虑使用let而不是var作为默认选择的人可能想先多考虑一下……这里有一篇关于利弊的好文章:davidwalsh.name/for-and-against-let .它不像“只要不方便就使用let”那么简单。这可能最终仍然是一些程序员的结论,但最好先了解利弊......
  • 嗨@MattBrowne。感谢您的链接,但我不认为这篇文章是一个很好的案例。基本上它的意思是:(1)如果你在使用 let 声明之前使用了一个变量,你的代码会中断,(2)如果你在创建它的块之外使用一个变量,你的代码会中断,(3)如果你发现并且在写得不好的现有代码中将“var”替换为“let”,您的代码会中断,(4)有一个很酷的 let 提案,但没有成为最终标准,(5)如果你在任何地方都使用 let,你不会如果您的意思是块作用域或函数作用域,则不进行通信......这里唯一值得考虑的一点是(5)
  • @neelsg 无论如何,(5)是一个非常糟糕的案例。如果您确实希望在嵌套作用域外部 可见(例如在函数级别,而不是在if 语句中),那么您应该在嵌套作用域之外声明它。这可以更清楚地传达意图,并且与绝大多数其他语言一致。
  • 我认为 David Walsh 写的 about let and var 听起来很合理,并给出了很多例子,你应该做什么,不应该做什么。还推荐他关于coercion, i.e. implicit casts in JavaScript的文章。如果您不知道,它们可能会导致许多错误(您何时使用== 以及何时使用===?);-) ...
【解决方案3】:

一般使用 let,偶尔使用 var。

块作用域是标准的和最易读的选择,它将使调试更容易。块作用域可以很容易地看到变量在作用域中的确切位置。函数作用域使事情变得不那么明显,并且更容易意外引入具有作用域错误的错误。

一般来说,您可以使用的范围越小越好。因此let 超过var

特别是,它有助于解决关闭变量的无穷无尽的问题,并且在执行关闭之前没有意识到它们的值会发生变化:

for (var i = 1; i <= 5; i++) {
  var item = document.createElement("LI");
  item.appendChild(document.createTextNode("Item " + i));

  let j = i;
  item.onclick = function (ev) {
    alert("Item " + j + " is clicked.");
  };
  list.appendChild(item);
}

【讨论】:

猜你喜欢
  • 2011-09-11
  • 2017-09-11
  • 1970-01-01
  • 2015-04-07
  • 2012-12-23
  • 2021-07-13
  • 2018-03-07
  • 2019-04-13
  • 2022-01-02
相关资源
最近更新 更多