如果babel将let和const转换为var,有什么区别?

时间:2019-02-14 15:47:37

标签: javascript ecmascript-6 babeljs javascript-objects ecmascript-5

我尝试过the babel transpiler,它将All let,const和var转换为var,所以,总的来说,我们的代码用法有什么区别?
 我已经阅读了文档,并且我知道let,const和var 有什么区别,但是如果所有这些最终都转换为var 差异是什么强>?这意味着在性能甚至范围上都不应有任何有意义的差异!

更新(02.14.2019):根据我的回答,我知道范围的确很重要,即使将它们转换为var,babel仍然保留了范围的含义。我的问题仍然是性能,是否存在有意义的差异?

在更复杂的情况下,我已经附加了编译器的输入和输出
输入

let a = 1;

for (let a = 0; a !== 0;) {
  for (let a = 0; a !== 0;) {}
}

输出

"use strict";

var a = 1;

for (var _a = 0; _a !== 0;) {
  for (var _a2 = 0; _a2 !== 0;) {}
}

2 个答案:

答案 0 :(得分:8)

Babel将ES6语法转换为ES5语法(或您要处理的JS的任何源版本和目标版本)。

这通常会丢失一些代码中的细微差别,但是您正在看一个非常简单的示例。

请改用此方法

let x = 1;

{
  // Inside a block, this is a different x
  let x = 2; 
  console.log(x);
}

console.log(x);

Babel会将其转换为:

"use strict";

var x = 1;
{
  // Inside a block, this is a different x
  var _x = 2;
  console.log(_x);
}
console.log(x);

看看它如何重命名内部x以便不覆盖外部conn.getRepsonseMessage()

即使结果很难看(因为ES6的优雅功能不可用),它也尽可能表达ES6的效果

答案 1 :(得分:3)

Babel对每个变量进行检查,如果违反了某些程序规则,则会引发错误。例如,如果定义了const,并且稍后更改了该值,则将违反类型的规则。另一个可能是如果在已经存在的作用域中重新定义了变量(这可能是同名的函数)。在某些情况下,Babel只是简单地重命名内容以防止冲突。