目前有哪些浏览器支持JavaScript的'let'关键字?

90

我正在开发一个应用程序,不需要担心Internet Explorer,而且正在研究一些A+级浏览器中存在但不在Internet Explorer1中的特性之一。

其中一个特性是JavaScript的let关键字

我似乎无法在Firefox 3.6(User-Agent字符串:Mozilla/5.0(Windows; U; Windows NT 5.1; en-US; rv:1.9.2)Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729))中运行任何他们的“let”示例。当执行 let foo = "bar" 时,我会得到SyntaxError: missing ; before statement

那么,哪些浏览器支持let关键字?(或者我做错了什么?)


当您理解并同意您不关心在IE上是否能正常工作时,您应该考虑到“let”关键字仅适用于Mozilla,因此即使可以说“IE不支持它”,正确的说法应该是“只有Mozilla支持它”。就像我们避免使用IE专有标签或关键字一样,您也应该避免使用* -only关键字。 - WhyNotHugo
Hugo,你需要记住HTML、CSS、JS不再是仅限于Web的平台。这段代码实际上永远不会在任何版本的IE或者任何web浏览器中运行。 :-) - David Murdoch
到底苹果在搞什么..都已经2015年了,他们那可怜的浏览器还没有支持let关键字的迹象。 - salmatron
3
请注意:许多旧答案(包括被接受的答案)已经过时。所有现代主流浏览器都支持 ES2015(又名“ES6”)的 let 关键字,但截至本文撰写时,在某些领域的支持还比较新(例如,仅有 iOS 10 Safari 支持)。 - T.J. Crowder
我建议您将已接受的答案更改为现在正确的答案之一。是的,当前接受的答案在当时是正确的,但是现在已经错误了几年了,而 SO 的目的是成为知识库,而不是历史档案馆。 :-) - T.J. Crowder
这个问题在2010年是如何提出的?我以为letconst是在2015年的es6中引入的? - Kyle Vassella
7个回答

65

编辑:letconst 已经被所有现代浏览器支持,并且是 ECMAScript 2015 (ES6) 规范的一部分。

基本上,如果您不需要支持 IE11 及以下版本的浏览器,那么现在使用 letconst 是安全的。

IE11 上,当与 for 循环结合使用时,let 存在一个小问题,该变量不会像您预期的那样绑定到 for 块中,而是表现得像 var...

另请参阅:letconst 支持情况。


来自 2010 年的旧且过时的答案: 这些扩展不符合 ECMA 标准,仅受 Mozilla 实现支持。

在浏览器环境中,您应该在 script 标签中包含 JavaScript 版本号 才能使用它:

<script type="application/javascript;version=1.7">  
  var x = 5;
  var y = 0;

  let (x = x+10, y = 12) {
    alert(x+y + "\n");
  }

  alert((x + y) + "\n");
</script>

1
好的,我刚刚更新了我的答案,然后发现你比我快一分钟;)。+1 - Harmen
1
谢谢,我之前使用了 HTML 5 的 '<script></script>' 标签但没有加上 type 属性。 - David Murdoch
20
请注意,let关键字现在已经包含在ECMAscript 6(草案)标准中。 - Nico Burns
3
可以在Chrome 19+中通过“实验性JavaScript功能”标志启用,在node.js中使用--harmony启用。 - salmatron
2
在Firefox中是否仍需要使用“;version=1.7”?我在控制台中尝试了“let”,它起作用了。 - sam
似乎这个版本规范现在已经过时了。如果我尝试指定版本,Chrome 就无法加载那个 JavaScript。 - Jay Shah

34
截至2017年4月: - 所有主流浏览器(如Chrome、Firefox和Edge)都支持ES2015(也称为“ES6”)的`let`关键字。 - iOS Safari 直到版本10才支持`let`(例如,OS 9不支持)。 - 一些旧版浏览器(如IE9-IE11)支持一个早期版本的`let`,但不支持ES2015定义的语义(特别是`for`循环头部声明的变量)。所以这不是语法错误,并且确实声明了变量,但它的工作方式不正确。例如,在正确的实现中,以下代码将输出0、1和2;在IE9-IE11中,它将输出3、3、3:
 for (let i = 0; i < 3; ++i) {
      setTimeout(function() {
          console.log(i);
       }, i * 100);
  }
 

  • 过时的浏览器,如IE8根本不支持它。


  • 25

    1
    虽然IE11确实“支持”let关键字(它不会抛出SyntaxError),但它的实现不符合规范 - 变量没有正确地块作用域。 (还要注意,IE 11之后将永远不会有任何版本) - CertainPerformance

    12

    Internet Explorer和Opera不支持任何浏览器版本上的let,Firefox自2.0版本以来和Safari自3.2版本以来支持。

    请查看维基百科上的JavaScript版本表

    我刚刚发现您需要定义是否使用JavaScript 1.7。因此,您的代码将是:

    <script type="application/javascript;version=1.7"> ... </script>
    

    看起来这个版本规范现在已经过时了。如果我尝试指定版本,Chrome就无法加载那个JavaScript。 - Jay Shah
    有关浏览器版本支持的信息已过时。 - derloopkat

    6

    3
    自从这个问题被提出以来已经过去了很长时间:在ECMAScript 2015(ES6)中引入了'let'和'const'关键字。在这个很棒的ES6兼容性表中搜索'let'或'const': https://kangax.github.io/compat-table/es6/

    2

    最新消息:Chrome现在支持 let,但只有在声明 "use strict" 指令时才能使用。


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