'let 和 'var' 在 Typescript 中是否相同?

'let and 'var' are the same in Typescript?

我正在看 AngularJS 2 和 Typescript,我决定用它做点什么来学习 Typescript 的基础知识。通过许多研究,我发现了关于模块、Typescript 的好话题,其中之一是谈论 'let' 和 'var' 命令来声明变量;根据 this 问题,下面的 Typescript 代码应该只显示一个警告并在控制台中抛出错误:

test.ts:

for(let i = 0; i < 1; i++) {
    alert(i);
}
alert(i);

已编译test.js:

for(var i = 0; i < 1; i++) {
    alert(i);
}
alert(i);
//# sourceMappingURL=test.js.map

但事实并非如此。编译器"ignores" "let" 命令并将其转换为"var" 命令。为什么会这样? Typescript 是否仅适用于 类?

我正在为 'npm start' 使用 AngularJS 配置,所以它会自动编译我的 'test.ts' 文件:

  "scripts": {
    "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" ",
    "lite": "lite-server",
    "postinstall": "typings install",
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "typings": "typings"
  },

在此示例中,varlet 具有相同的效果,var 在大多数 JS 引擎上更快一点,因此 TypeScript 通过更改为您做了一些性能优化var.

现在,如果您尝试另一个示例,您会发现 let 不仅变成了 var,而且还发生了更多神奇的事情:

for (let i = 0; i < 3; i++) {
  setTimeout(function() { alert(i); });
}

确实在这个例子中 letvar 不会有相同的效果。 let 会显示 1 2 3 而使用 var 我们会看到 3 3 3。如果您想了解更多有关 ES6 引入的 let 关键字的信息,您可以查看:

https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Instructions/let

它们相同,但在函数内部使用时存在差异

function theDifference(){
    for(let emre = 0; emre < 10; emre++){
    // emre is only visible inside of this for()
    }

// emre is NOT visible here.
}

VAR

function theDifference(){
    for(var emre = 0; emre < 10; emre++){
    // emre is visible inside of this for()
    }

// emre is visible here too.
}

But it isn't. The compiler "ignores" the "let" command and turns it into the "var" command. Why does this happen? Does Typescript only works properly with classes?

编译器默认转译为 ES3。 let 关键字在 ES3 中不存在,因此发射器必须使用 ES3 中可用的语法发出代码...在这种情况下,let 关键字的最佳替代是 var 关键字.

如果你想让它用 let 关键字发出,那么你必须在 tsconfig.json 或命令中以 ES6-"target": "es6" 为目标行选项 --target es6。这样做将输出与您输入的代码相同的代码。

请注意,即使您的代码在运行时运行,它也会抛出一个错误让您知道您在编译时犯了一个错误:

for(let i = 0; i < 1; i++) {
    alert(i);
}
alert(i); // compile error: cannot find name 'i'