【问题标题】:'let and 'var' are the same in Typescript?'let 和 'var' 在 Typescript 中是一样的吗?
【发布时间】:2016-09-23 09:30:19
【问题描述】:

我正在研究 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

但事实并非如此。编译器“忽略”“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"
  },

【问题讨论】:

标签: javascript typescript var let


【解决方案1】:

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

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

如果您希望它使用 let 关键字发出,那么您必须在 tsconfig.json 或命令行选项 --target es6 中定位 ES6—"target": "es6"。这样做会输出与您输入的代码相同的代码。

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

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

【讨论】:

    【解决方案2】:

    在此示例中,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

    【讨论】:

    • i &lt; 1 那么零(0)? 向上i &lt; 5,这样人们就可以真正看到魔法了。也许使用var 提供相同的循环来比较差异。只是一个建议。
    • 我觉得不一样。如果我在纯 JS 中运行我的示例,控制台会给我一个错误,并且只显示一个警报,就像我预期的那样。如果我把它放在 TS 上并编译,它会显示两个警报,因为它将“let”变成“var”。所以我不会因为 TS 不接受“让”字而使用相同的代码得到相同的结果。
    • @Marcus 这里的迭代次数并没有改变重点:当我们使用 setTimeout 离开堆栈时,即使只有一次,编译也是完全不同的。你可以看到使用typescriptlang.org/play
    • @EdieJohnny 我现在明白你的意思了,确实翻译隐藏了一个错误,你是完全正确的。我想合理的结论是,如果可能的话,您应该在编译之前使用jshinteslint 等工具检查代码是否存在潜在错误。但是我自己不使用 TypeScript,所以我无法透露更多信息,而且这些工具可能甚至无法使用它。
    • @floribon - 我明白了。我的建议只是(可能)为那些可能没有的人改进你的答案。使用0 一次返回alert 可能会让人们想知道它有什么特别之处。但是通过我建议的更改,您可以看到实际发生的情况,即。 var i = 0; i &lt; 5; $i++) // 5 5 5 5 5, vs. for (let i = 0; i
    【解决方案3】:

    它们相同,但在函数中使用时存在不同

    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.
    }
    

    【讨论】:

    • 这不是一个很好的例子。 Typescript 编译器会报错,但在 let 示例中,emre 实际上在 for 之外仍然可见。
    猜你喜欢
    • 2015-11-10
    • 2018-05-14
    • 1970-01-01
    • 2021-09-13
    • 2018-12-09
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多