就浏览器兼容性而言,在 javascript 中使用“let”?
Posted
技术标签:
【中文标题】就浏览器兼容性而言,在 javascript 中使用“let”?【英文标题】:Using "let" in javascript in terms of browser compatibility? 【发布时间】:2012-11-14 21:57:27 【问题描述】:在 javascript 中使用 let
关键字的选项有哪些。好像真的很有用。
我见过traceur,但我想知道是否还有其他选择,所以我不必通过它运行整个项目。
是否有可能使用某种类型的 polyfill 或库。还是我基本上必须等到所有旧浏览器都死了才能原生使用它...
【问题讨论】:
不是答案,但如果您决定等待旧浏览器消亡,请关注kangax.github.com/es5-compat-table/es6 可能会很有趣。 对于今天对此感兴趣的任何人:您现在可以使用 babeljs 到 babeljs.io/docs/learn-es6/#let-const 来获得跨浏览器的 let 功能,并且 chrome 42 现在支持 let 关键字! gkiely Babel 是编译器,而不是 polyfill。 【参考方案1】:让我引用我刚刚在 You Don't Know JS: Scope & Closures - Appendix B: Polyfilling Block Scope
上看到的内容PS:这是Creative Commons CC BY-NC-ND 3.0授权的,所以只要提到参考就可以分享了
前面的大引号:
考虑以下示例
let a = 2;
console.log( a ); // 2
console.log( a ); // ReferenceError
这将在 ES6 环境中工作得很好。但是我们可以在 ES6 之前这样做吗?抓住就是答案。
trythrow 2catch(a)
console.log( a ); // 2
console.log( a ); // ReferenceError
哇!那是一些丑陋、奇怪的代码。我们看到一个看起来强制抛出错误的try/catch,但它抛出的“错误”只是一个值2,然后接收它的变量声明在catch(a)子句中。心灵:被吹了。
没错,catch 子句具有块作用域,这意味着它可以在 ES6 之前的环境中用作块作用域的 polyfill。
“但是……”,你说。 “……没有人愿意写出那样丑陋的代码!”确实如此。也没有人编写(部分)由 CoffeeScript 编译器输出的代码。这不是重点。
关键是工具可以将 ES6 代码转换为在 ES6 之前的环境中工作。您可以使用块范围来编写代码,并从此类功能中受益,并让构建步骤工具负责生成在部署时可以实际工作的代码。
这实际上是所有(嗯,大多数) ES6 的首选迁移路径:在从 pre-ES6 过渡到 ES6 期间,使用代码转译器获取 ES6 代码并生成与 ES5 兼容的代码。
【讨论】:
如果我需要向某人解释什么是 hack,我会记住这一点!与此同时,你让我很开心,谢谢! 天哪,这是一个令人难以置信的聪明和可怕的解决方案。但它有效!【参考方案2】:绝对没有办法在 ECMAscript 中模仿/填充关键字。所以你要么选择完全使用它(目前这可能是一个非常糟糕的主意),要么你还不能使用它。
您可能知道,let
是 ECMAscript Next / Harmony 的一部分,充其量只是作为 实验性功能 在一些浏览器。即使let
是一个非常稳定的功能,ES.Next 规范仍然在不断变化。去玩它,但依赖它真的没有意义imho。
【讨论】:
很好的回答和建议,证实了我的想法。正如克罗克所说的 ES5:也许我们的孩子会使用它。 我认为 ES6 的特性会比浏览器早几年在 node.js 中得到广泛应用。 @jAndy 你可能对我发布的解决方案感兴趣 你不能使用 babel 或其他编译器或预编译器吗?不知道该怎么称呼这些东西。 同意,Babble 不是“模仿”/翻译 ES5 中的 ES6 关键字吗?这最初是在 2012 年发布的,所以当时可能没有 Babble?以上是关于就浏览器兼容性而言,在 javascript 中使用“let”?的主要内容,如果未能解决你的问题,请参考以下文章