我提交了一个关于堆栈溢出的问题,询问如何阻止putTestQuestionResponses()函数执行IF以前的版本已经执行。
回复是添加一个处理标志,该标志位于此代码的第2行。
你能告诉我为什么在这里使用“let”代替“var”吗?
var promisePutTestQuestion;
let processing = false;
onEnter: ['$interval', 'questionService',
($interval, qus: IQuestionService) => {
promisePutTestQuestion = $interval(() => {
if (processing)
return;
processing = true;
qus.putTestQuestionResponses()
.then(() => processing = false)
}, 5 * 1000);
}],
onExit: ['$interval', ($interval) => {
$interval.cancel(promisePutTestQuestion);
}]
答案 0 :(得分:49)
var
声明是函数作用域,let
声明是块作用域。
有关详细信息,请参阅https://basarat.gitbooks.io/typescript/content/docs/let.html。
答案 1 :(得分:22)
示例:
SetEndOfFile
很容易知道
答案 2 :(得分:13)
var
变量是函数作用域。这与变量是块作用域的许多其他语言(C#,Java等)不同。如果你将一个块范围的思维模式带到JavaScript,你可能希望以下内容打印123,而不是它将打印456:
var foo = 123;
if (true) {
var foo = 456;
}
console.log(foo); // 456
这是因为{
不会创建新的变量范围。变量foo
在if块内部与if块外部相同。这是JavaScript编程中常见的错误来源。这就是TypeScript(和ES6)引入let
关键字以允许您使用真块范围定义变量的原因。也就是说,如果使用let
而不是var
,则会获得与您在范围外定义的内容断开的真正唯一元素。使用let
:
let foo = 123;
if (true) {
let foo = 456;
}
console.log(foo); // 123
答案 3 :(得分:3)
function varTest() {
var x = 1;
if (true) {
var x = 2; // same variable!
console.log(x); // 2
}
console.log(x); // 2
}
function letTest() {
let x = 1;
if (true) {
let x = 2; // different variable
console.log(x); // 2
}
console.log(x); // 1
}
我在这里找到了
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
答案 4 :(得分:0)
一切都与可访问性有关。如果您使用 let
,那么它只能在该范围内访问,而不能超出 function
、if
、else
范围。但是 var
我们可以在 for
、if
、else
之外访问。
见下面的代码
public selectedLocation(country)
{
if(instance==this.list[0])
{
var obj=this.productArray
}
for(let i = 0; i < this.obj.length; i++)
{
obj=this.productPending
}
}
以上代码适用于 var obj
,但不适用于 let obj
的 for loop
。