是否可以使用"让"和" const"在ES6之前的代码?

时间:2018-05-30 14:49:47

标签: javascript ecmascript-6 ecmascript-5

我(重新)学习Javascript,并建议我不要混用ES5和ES6类型的代码。但我的IDE,Webstorm,一直警告我,我应该在我的代码中使用 let const - 有大量的黄色标记。当然我可以关闭那些警告,但是我应该在适当的时候总是使用 let const ,即使我的其余代码目前是&# 34;旧学校" JavaScript的? (顺便说一句,我欢迎任何有关转换到ES6的最佳实践的链接/建议,即开始将ES6引入代码的最佳方式)。谢谢!

1 个答案:

答案 0 :(得分:0)

问题的基本答案:否,在真正的ES5中不能使用letconst。您需要使用var。补充说明一下:如果Webstorm发出了这些警告,但您在编写ES5,则您的设置是错误的。转到设置>语言和框架> Javascript,然后将Java语言版本更改为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';

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

最后的提示:如果您使用的是PromiseSymbol之类的新功能,那么编译器是不够的。您还需要为这些使用polyfill。