让变量使用let还是var?

15
在过去几个月里,我一直在学习JavaScript。多年来我一直在滥用这种语言,但现在我敢说我更好地理解了这门语言,并且我开始喜欢其函数式特性所带来的好处。
最近我开始学习Scheme,但那只是为了好玩。在浏览MDN参考文档时,我注意到JS虽然缺乏块级作用域,但确实有一个关键字可以用于在给定代码块中声明局部变量,就像Scheme的let一样:
for (var i=0;i<someArray.length;i++)
{
    console.log(someArray[i]);
}
console.log(i);//will log someArray's length

鉴于:

for (let i=0;i<someArray.length;i++)
{
    console.log(someArray[i]);
}
console.log(i);//undefined

现在我想知道的是:为什么不经常使用let?这与X浏览器支持有关吗?这只是那些鲜为人知的好东西之一吗?
简而言之,使用varlet相比有什么优点?有哪些注意事项?

就我所知,let的行为更加一致(在单个块中的双重声明会引发TypeError,但对于函数体则不然(ECMA6草案修复了这个问题)。
说实话,除了这个特性/关键字并不是很出名外,我很难想到任何反对在循环或任何需要临时变量以使代码更易读的地方使用let的理由。

1个回答

28

是的,它完全与浏览器支持有关。目前只有Firefox实现了它(因为它是ECMAScript超集的一部分)。

但是在ES6中即将到来,所以还有希望...

我认为不能说使用varlet有多少好处,因为两者都得到了支持。我认为口号将是" let是新的var


无法接受您的答案(再给我5分钟),但您绝对是正确的,我分享您的希望...虽然有些傻,但我目前正在使用Chrome,如果我花时间打开控制台并尝试let x = 1;,我就会知道那里有问题。傻,但仍然:让我们希望每个阅读此问题的人都在ECMA邮件列表中提出支持let的请求 :) - Elias Van Ootegem
1
@EliasVanOotegem:是的,据我所知他们的目标是2013年12月,所以我们需要等待一段时间,但是您可以通过设置启动标志来启用Chrome中已实现的一些新功能,以允许实验性JavaScript。不确定let是否包含在其中。要设置这些内容,请在Chrome的地址栏中键入“chrome://flags/”。 - I Hate Lazy
刚刚启用了实验性功能,并支持 let,但是 Firefox 和 Chrome 之间存在一些差异,尽管其中的一部分可能是由于控制台 eval 代码的方式不同造成的。无论如何,非常感谢提供链接。 - Elias Van Ootegem
TypeScript 1.4 版本将支持 let:https://github.com/Microsoft/TypeScript/pull/904 - Vadorequest
@Vadorequest:那不是重点,因为TS只是被转译成JS。这个问题是关于各种JS实现的,而不是关于转译器/交叉编译器以及它们如何处理ES6特性的问题。 - Elias Van Ootegem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接