'让和' var'在打字稿中是一样的吗?

时间:2016-05-25 16:25:24

标签: javascript typescript var let

我正在看看AngularJS 2和Typescript,我决定用这个来学习一些打字稿的基础知识。通过许多研究,我发现了关于模块,Typescript的好主题,其中一个是在谈论' let'和' var'命令声明变量;根据{{​​3}}问题,下面的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

但它不是。编译器&#34;忽略&#34; &#34;让&#34;命令并将其转换为&#34; var&#34;命令。为什么会这样? Typescript只适用于类吗?

我正在使用AngularJS配置来开始&#39; npm start&#39;所以它会编译我的测试。&#39;文件自动:

  "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"
  },

3 个答案:

答案 0 :(得分:12)

  

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

默认情况下,编译器会转换为ES3。 ES3中不存在let关键字,因此发射器必须使用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'

答案 1 :(得分: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

答案 2 :(得分:0)

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

可让

$(function () {
  $('.Box1').mouseover(function(e) {
    $('.Box2').addClass("hovered");
  });
  $(".Box1").mouseout(function () {
    $(".Box2").removeClass("hovered");
  });

  // or optionally using .hover() for in/out handling as per A. Wolff's comment
  $(".Box1").hover(function () {
    $(".Box2").addClass("hovered");
  }, function () {
    $(".Box2").removeClass("hovered");
  });
});

<强> VAR

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

// emre is NOT visible here.
}