我什么时候应该使用let和var?

cal*_*rae 38 javascript variables ecmascript-harmony ecmascript-6

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

显然,现在我应该总是使用var关键词,因为let一切都不支持.

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

我理解差异 - var用于函数范围let而是用于块作用域 - 但我正在寻找像"总是使用let关键字"或" var在函数顶部使用关键字,但在for循环中使用let关键字"之类的东西.

nee*_*lsg 27

我会说,作为一项原则,你应该let在不方便的时候使用.如:

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

if (condition) {
    let msg = a + b + c;
    console.log(msg);
    alert(msg);
}
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是:

  1. 覆盖某些全局变量用于其他事物的风险较小
  2. 内存泄漏的风险较小,因为变量在变得无关紧要之后很久就会停留在内存中

  • @neelsg和(5)是一个非常糟糕的情况,无论如何.如果你真的想要在嵌套作用域之外的某些东西*(例如在函数级别,而不是在`if`语句中),那么你应该在嵌套作用域之外声明它.这更直接地传达了意图,并且与绝大多数其他语言一致. (6认同)
  • 嗨@MattBrowne.感谢您的链接,但我不认为这篇文章是一个非常好的案例.基本上它所说的是:(1)如果你在声明使用let之前使用变量,你的代码就会中断,(2)如果你在创建的块之外使用了一个变量,你的代码就会中断,(3)如果你找到并且在写得不好的现有代码中将"var"替换为"let",代码中断,(4)有一个很酷的提议,让它没有进入最终标准,(5)如果你在任何地方使用let,你不要如果你的意思是块范围或功能范围,那就不会沟通......这里唯一值得考虑的是(5) (4认同)
  • 那些考虑使用`let`作为默认选择而不是`var`的人可能想先给出更多的思考......这里有一篇关于利弊的好文章:http://davidwalsh.name/for-and -against-LET.它并不像"使用`let`一样简单,只要这样做不方便".这可能仍然是程序员最终的结论,但首先要了解利弊是好的... (2认同)

Phi*_*l H 13

使用let作为一般规则,偶尔使用 var.

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

通常,您可以使用的范围越小越好.因此letvar.

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

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);
}
Run Code Online (Sandbox Code Playgroud)


oox*_*oxi -6

var如果您需要函数作用域和let块作用域,那么答案非常简单。

  • OP已经提到过这一点。 (9认同)