为什么typescript transpiler不提升变量?

为什么typescript transpiler不提升变量?,typescript,transpiler,Typescript,Transpiler,我知道ES6和TypeScript都支持块级别的作用域,但是当以ES3和ES5为目标时,输出应该是函数级别的作用域。我认为TypeScript没有提升变量的背后一定有一个逻辑。。我没有遇到问题,我只是好奇为什么它不提升变量 例如,给定以下类型脚本: function seed(length: number, multiplier: number): number[] { let result: number[] = []; for(let i: number = 0; i < l

我知道ES6和TypeScript都支持块级别的作用域,但是当以ES3和ES5为目标时,输出应该是函数级别的作用域。我认为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;
}
函数种子(长度:number,乘数:number):number[]{
let结果:数字[]=[];
for(设i:number=0;i
transpiler输出:

function seed(length, multiplier) {
  var result = [];
  for (var i = 0; i < length; i++) {
    var n = i * multiplier;
    result.push(n);
  }
  return result;
}
函数种子(长度、乘数){
var结果=[];
对于(变量i=0;i
我所期望的结果是将变量声明提升到函数顶部。看起来像这样:

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

  for (i = 0; i < length; i++) {
    n = i * multiplier;
    result.push(n);
  }
  return result;
}
函数种子(长度、乘数){
变量
i、 n,,
结果=[];
对于(i=0;i

非常感谢您的任何见解。谢谢

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

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

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

正是这样。因为这不是一个问题,为什么要进行吊装工作

同样在
的情况下,让
按照您所展示的方式吊起它实际上是错误的

暂时死区 首先,在像
var
变量这样的声明可以使用之前,不能使用
let
变量。使用var,您将得到
未定义的
。使用
let
时,由于时间死区,会出现
ReferenceError
。幸运的是,TypeScript无论如何都会给您一个编译时错误,这样您就不会在运行时遇到:

console.log(a); // Error: Block scoped variable used before declaration 
let a = 123;
块范围
let
for
中声明的变量仅在for循环中可用。这是因为它们是块范围的,而不是函数范围的

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

for(设i:number=0;i<10;i++){
}  
console.log(i);//错误:范围中没有变量i

希望这会有所帮助,但ES3/5的输出使用let,而不是var。因此它可以将声明移到顶部。但在已经检查过正确性的自动生成代码中这样做并没有多大意义。
for(let i: number = 0; i < 10; i++) {    
}  
console.log(i); // Error: no variable i in scope