2

我知道 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;
}

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

4

2 回答 2

7

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

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

于 2016-05-12T16:40:42.787 回答
4

我认为为什么 TypeScript 不提升变量背后必须有一个逻辑......而且我没有遇到问题,我只是好奇它为什么不提升变量。

正是这样。既然不成问题,何必费力吊装呢?

同样,如果let按照您展示的方式吊装它实际上是错误的。

时间死区

首先let,变量不能在声明之前使用,就像var变量一样。使用 var 你会得到undefined. 有了let你会得到一个ReferenceError由于时间死区。幸运的是,TypeScript 无论如何都会给你一个编译时错误,所以你不会在运行时遇到它:

console.log(a); // Error: Block scoped variable used before declaration 
let a = 123;

块范围

let在 a 中声明的变量for 在 for 循环中可用。这是因为它们是块作用域而不是函数作用域更多关于这个

如果您误用 TypeScript let(而不是在运行时遇到它),TypeScript 会再次给您一个编译时错误:

for(let i: number = 0; i < 10; i++) {    
}  
console.log(i); // Error: no variable i in scope

希望有帮助

于 2016-05-13T02:28:00.667 回答