首页 > 解决方案 > 如果 babel 将 let 和 const 转换为 var,有什么区别?

问题描述

我试过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;) {}
}

标签: javascriptecmascript-6babeljsjavascript-objectsecmascript-5

解决方案


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,这样它就不会覆盖外部的?

它在 ES5 中尽可能多地表达了ES6 的效果,即使结果很丑陋(因为 ES6 的优雅特性不可用)。


推荐阅读