JavaScript,变量作用域,变量求值顺序
JavaScript, variables scope, order of variable evaluation
我正在使用量角器测试一些 angularjs 应用,遇到了这样的问题:
var counter = 0;
redButton.click();
allImages.each(function(element) {
element.isDisplayed().then(function(isDispl){
if(isDispl === true){
expect(element.getInnerHtml()).toContain('red');
counter++;
console.log("I'm here!")
}
});
});
console.log(counter);
输出为:
0
I'm here!
I'm here!
虽然我期望输出:
I'm here!
I'm here!
2
为什么会这样?为什么变量 counter 不等于 2 -- 条件 isDispl === true 被填满的次数?
在JavaScript中一次只能运行一个函数(这简化了一点,也有例外)。
主要功能 运行 在其他任何事情发生之前一直完成。由于该函数包含 console.log(counter);
,因此它会记录当时 counter
的值 。
函数完成后,事件循环可以查找已触发的事件。
元素已显示,因此它们的承诺已触发。每次发生这种情况(两次),您都会收到一条消息,并且 counter
的值会发生变化。
因为这发生在你唯一一次输出 counter
的值之后,你永远不会观察到它达到 2
。
我正在使用量角器测试一些 angularjs 应用,遇到了这样的问题:
var counter = 0;
redButton.click();
allImages.each(function(element) {
element.isDisplayed().then(function(isDispl){
if(isDispl === true){
expect(element.getInnerHtml()).toContain('red');
counter++;
console.log("I'm here!")
}
});
});
console.log(counter);
输出为:
0
I'm here!
I'm here!
虽然我期望输出:
I'm here!
I'm here!
2
为什么会这样?为什么变量 counter 不等于 2 -- 条件 isDispl === true 被填满的次数?
在JavaScript中一次只能运行一个函数(这简化了一点,也有例外)。
主要功能 运行 在其他任何事情发生之前一直完成。由于该函数包含 console.log(counter);
,因此它会记录当时 counter
的值 。
函数完成后,事件循环可以查找已触发的事件。
元素已显示,因此它们的承诺已触发。每次发生这种情况(两次),您都会收到一条消息,并且 counter
的值会发生变化。
因为这发生在你唯一一次输出 counter
的值之后,你永远不会观察到它达到 2
。