如果babel把let和const转成var,有什么区别?
If babel converts let and const to var, what's the difference?
我试过the babel transpiler,它把所有的let、const和var都转换成了var,所以总的来说,我们的代码使用有什么不同?
我看过文档,我知道let、const和var有什么区别,但是如果它们最终都转换成var,那又是什么区别?这意味着在性能甚至范围上不应该有任何有意义的差异!
Update(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;) {}
}
Babel 对每个变量运行检查,如果违反某些程序规则则抛出错误。例如,如果定义了 const
,并且稍后更改了值,这将违反类型规则。另一个是如果一个变量在它已经存在的范围内被重新定义(这可能是一个同名的函数)。在某些情况下,Babel 只是简单地重命名事物以防止冲突。
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的优雅特性)。
我试过the babel transpiler,它把所有的let、const和var都转换成了var,所以总的来说,我们的代码使用有什么不同?
我看过文档,我知道let、const和var有什么区别,但是如果它们最终都转换成var,那又是什么区别?这意味着在性能甚至范围上不应该有任何有意义的差异!
Update(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;) {}
}
Babel 对每个变量运行检查,如果违反某些程序规则则抛出错误。例如,如果定义了 const
,并且稍后更改了值,这将违反类型规则。另一个是如果一个变量在它已经存在的范围内被重新定义(这可能是一个同名的函数)。在某些情况下,Babel 只是简单地重命名事物以防止冲突。
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的优雅特性)。