为什么打字稿转译器不提升变量?

rot*_*oto 2 transpiler typescript

我知道 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;
}
Run Code Online (Sandbox Code Playgroud)

转译器输出:

function seed(length, multiplier) {
  var result = [];
  for (var i = 0; i < length; i++) {
    var n = i * multiplier;
    result.push(n);
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

我预期的结果是变量声明被提升到函数顶部。看起来像这样:

function seed(length, multiplier) {
  var
    i, n,
    result = [];

  for (i = 0; i < length; i++) {
    n = i * multiplier;
    result.push(n);
  }
  return result;
}
Run Code Online (Sandbox Code Playgroud)

任何见解都非常感谢。谢谢!

Dav*_*ret 5

这是因为编译器不会根据编码标准输出代码。它试图尽可能接近原始输入。

请注意,var变量无论如何都会在幕后提升var hoisting)。在这种情况下,TypeScript 编译器不需要更改输入,这样做会不必要地增加其复杂性。