为什么打字稿转译器不提升变量?
Why does the typescript transpiler not hoist variables?
我知道 ES6 和 TypeScript 都支持块级范围,但是当以 ES3 和 ES5 为目标时,输出应该是函数级范围。我认为 TypeScript 不提升变量的原因背后一定有逻辑。我没有 运行 遇到问题,我只是好奇为什么它不提升变量。
例如,给定以下 TypeScript:
function seed(length: number, multiplier: number): number[] {
let result: number[] = [];
for(let i: number = 0; i < length; i++) {
let n: number = i * multiplier;
result.push(n);
}
return result;
}
转译器输出:
function seed(length, multiplier) {
var result = [];
for (var i = 0; i < length; i++) {
var n = i * multiplier;
result.push(n);
}
return result;
}
我所期望的结果是将变量声明提升到函数的顶部。看起来像这样:
function seed(length, multiplier) {
var
i, n,
result = [];
for (i = 0; i < length; i++) {
n = i * multiplier;
result.push(n);
}
return result;
}
非常感谢任何见解。谢谢!
这是因为编译器没有根据编码标准输出代码。它试图尽可能接近原始输入。
请注意,var
变量无论如何都会在幕后挂起 (var hoisting)。在这种情况下,TypeScript 编译器不需要更改输入,这样做会不必要地增加其复杂性。
I think there has to be a logic behind why TypeScript isn't hoisting variables.. and I'm not running into a problem, I'm more just curious why it doesn't hoist variables.
正是这样。既然不是问题,何必费力吊装呢?
同样在 let
的情况下,按照您展示的方式提升它实际上是错误的。
时间死区
首先,let
变量不能像 var
变量那样在声明之前使用。使用 var 你会得到 undefined
。由于 时间死区 ,let
你会得到 ReferenceError
。幸运的是,TypeScript 无论如何都会给你一个编译时错误,所以你不会 运行 在 运行 时进入那个:
console.log(a); // Error: Block scoped variable used before declaration
let a = 123;
块作用域
let
在 for
中声明的变量仅在 for 循环中可用。这是因为它们是 块作用域 而不是 函数作用域 。 More on this
再次,如果您误用 let
(而不是您 运行 在 运行 时进入它),TypeScript 会给您一个编译时错误:
for(let i: number = 0; i < 10; i++) {
}
console.log(i); // Error: no variable i in scope
希望对您有所帮助
我知道 ES6 和 TypeScript 都支持块级范围,但是当以 ES3 和 ES5 为目标时,输出应该是函数级范围。我认为 TypeScript 不提升变量的原因背后一定有逻辑。我没有 运行 遇到问题,我只是好奇为什么它不提升变量。
例如,给定以下 TypeScript:
function seed(length: number, multiplier: number): number[] {
let result: number[] = [];
for(let i: number = 0; i < length; i++) {
let n: number = i * multiplier;
result.push(n);
}
return result;
}
转译器输出:
function seed(length, multiplier) {
var result = [];
for (var i = 0; i < length; i++) {
var n = i * multiplier;
result.push(n);
}
return result;
}
我所期望的结果是将变量声明提升到函数的顶部。看起来像这样:
function seed(length, multiplier) {
var
i, n,
result = [];
for (i = 0; i < length; i++) {
n = i * multiplier;
result.push(n);
}
return result;
}
非常感谢任何见解。谢谢!
这是因为编译器没有根据编码标准输出代码。它试图尽可能接近原始输入。
请注意,var
变量无论如何都会在幕后挂起 (var hoisting)。在这种情况下,TypeScript 编译器不需要更改输入,这样做会不必要地增加其复杂性。
I think there has to be a logic behind why TypeScript isn't hoisting variables.. and I'm not running into a problem, I'm more just curious why it doesn't hoist variables.
正是这样。既然不是问题,何必费力吊装呢?
同样在 let
的情况下,按照您展示的方式提升它实际上是错误的。
时间死区
首先,let
变量不能像 var
变量那样在声明之前使用。使用 var 你会得到 undefined
。由于 时间死区 ,let
你会得到 ReferenceError
。幸运的是,TypeScript 无论如何都会给你一个编译时错误,所以你不会 运行 在 运行 时进入那个:
console.log(a); // Error: Block scoped variable used before declaration
let a = 123;
块作用域
let
在 for
中声明的变量仅在 for 循环中可用。这是因为它们是 块作用域 而不是 函数作用域 。 More on this
再次,如果您误用 let
(而不是您 运行 在 运行 时进入它),TypeScript 会给您一个编译时错误:
for(let i: number = 0; i < 10; i++) {
}
console.log(i); // Error: no variable i in scope
希望对您有所帮助