我正在看看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"
},
答案 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)
在此示例中,var
和let
具有相同的效果,var
在大多数JS引擎上都快一点,因此TypeScript通过将其更改为var
。
现在,如果您尝试使用其他示例,您会发现let
并未改为var
,但会发生更多魔法:
for (let i = 0; i < 3; i++) {
setTimeout(function() { alert(i); });
}
事实上,在此示例中,let
和var
不会产生相同的效果。使用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.
}