在javascript中使用let
关键字有哪些选项?看起来它真的很有用。
我见过traceur,但我想知道是否还有其他选项,所以我不必通过它运行整个项目。
甚至可以使用某种类型的polyfill或库。或者我基本上必须等到所有旧浏览器消失才能原生使用它...
答案 0 :(得分:21)
让我引用我刚才读到的 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之前这样做吗?赶上是答案。
try{throw 2}catch(a){
console.log( a ); // 2
}
console.log( a ); // ReferenceError
哇!这是一些丑陋,怪异的代码。我们看到一个try / catch似乎强行抛出一个错误,但它抛出的“错误”只是一个值2,然后接收它的变量声明在catch(a)子句中。介意:吹了。
这是正确的,catch子句具有块范围,这意味着它可以在ES6之前的环境中用作块填充的polyfill。
“但......”,你说。 “......没有人愿意像那样编写难看的代码!”确实如此。没有人写过(某些)CoffeeScript编译器输出的代码。这不是重点。
关键是工具可以将ES6代码转换为在ES6之前的环境中工作。您可以使用块范围编写代码,并从这些功能中受益,并让构建步骤工具负责生成在部署时实际工作的代码。
这实际上是所有(大多数)ES6的首选迁移路径:在从ES6之前到ES6的过渡期间,使用代码转换器来获取ES6代码并生成与ES5兼容的代码。
答案 1 :(得分:8)
绝对没有办法来模仿/填充ECMAscript中的关键字。所以你要么选择完全使用它(目前可能是一个非常糟糕的主意),或者你还不能使用它。
正如您所知,let
是 ECMAscript Next / Harmony 的一部分,充其量只是实验性功能在某些浏览器中。即使let
是一个非常稳定的功能, ES.Next 规范仍然处于不稳定状态。去玩它,但依靠它真的没有意义 imho 。