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

问题描述 投票:3回答:2

我试过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;) {}
}
javascript ecmascript-6 babeljs javascript-objects ecmascript-5
2个回答
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,以便它不会覆盖外部的const

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


3
投票

Babel对每个变量运行检查,如果违反某些程序规则则抛出错误。例如,如果定义了qazxswpoi,并且稍后更改了值,则会违反类型的规则。另一种情况是,如果变量在已经存在的范围内重新定义(这可能是同名的函数)。在某些情况下,Babel只需重命名以防止冲突。

© www.soinside.com 2019 - 2024. All rights reserved.