【问题标题】:Is it OK to use "let" and "const" in pre-ES6 code?在 ES6 之前的代码中使用“let”和“const”可以吗?
【发布时间】:2018-11-09 11:39:05
【问题描述】:

我正在(重新)学习 Javascript,建议我避免混合 ES5 和 ES6 类型代码。但是我的 IDE Webstorm 一直警告我应该在我的代码中使用 letconst —— 有大量的黄色标志。当然,我可以关闭这些警告,但我是否应该在适当的时候使用 letconst,即使我的其余代码目前是“旧的学校”的JavaScript? (顺便说一句,我欢迎任何关于过渡到 ES6 的最佳实践的链接/建议,即开始将 ES6 引入代码的最佳方式)。谢谢!

【问题讨论】:

  • 您所说的“可以吗”是什么意思?你在编译吗?
  • 我想——在这里我进入了可能被否决的敏感领域——我正在寻找最佳实践。我有一个更资深的程序员告诉我“不要混合 ES5/ES6 代码”,同时我收到了不使用 letconst 的警告——我想是什么我的意思是,即使您没有使用任何其他 ES6 功能,现在应该 always 使用 letconst 吗?
  • “不要混合 ES5/ES6 代码”没有意义。它们只是语言特征;如果您不使用其他功能,就没有理由避免使用其他功能。
  • 考虑到 ES6 的 90% 的语法/特性也存在于 ES5 中,我看不出这怎么可能。也许他们的意思是“不要在 ES5 环境中使用 ES6 特性”或“不要使用已被某些 ES6 特性取代的 ES5 特性”(例如对象文字中的方法定义)。

标签: javascript ecmascript-6 ecmascript-5


【解决方案1】:

您问题的基本答案:不,在真正的 ES5 中使用 letconst 是不行的。您需要使用var。补充一点:如果 Webstorm 发出了这些警告,但你正在编写 ES5,那么你的设置是错误的。转到设置 > 语言和框架 > Javascript,然后将您的 Javascript 语言版本更改为 ECMAScript 5.1。如果您知道您正在编写 ES5,那么您不应该将其设置为根据 ES6 规范验证您的代码。

这里有一些附加信息:

最近我一直在努力连接一个转译器 (Babel) 以在生产环境中将所有 Javascript 转换为 ES5 兼容的语法。如果您想使用 ES6 语法,但仍需要支持不符合 ES6 的浏览器(例如 IE9 - IE11),则需要像 Babel 这样的转译器。考虑到这一点,我想提出一些与letconst 相关的具体说明。

在真正的 ES6 中,使用 let 定义变量会在其块的范围内创建它。这意味着一旦块退出,该命名变量就会被丢弃。因此,可能会出现以下情况:

const x = 'I am a constant';
if (1 == 1) {
  let x = 'Not here for long';
  console.log(x); // => 'Not here for long'
}
console.log(x); // => 'I am a constant';

当使用let 创建x 的块范围实例时,该实例优先于该块内的const x(本例中的 if 语句)。 Babel 把它变成了什么来使它与 ES5 浏览器兼容实际上是相当聪明的:

var x = 'I am a constant';
if (1 == 1) {
  var _x = 'Not here for long';
  console.log(_x); // => 'Not here for long'
}
console.log(x); // => 'I am a constant';

正如您在此处看到的,它实际上创建了一个具有不同名称的新 var,_x,因此它不会与原始 x 冲突。

最后一点:如果您使用PromiseSymbol 等新功能,那么转译器是不够的。您还需要为这些使用 polyfill。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多