我遇到了一个有趣的JavaScript问题。我觉得这可能与闭包有关,我承认,我不太满意。
问题 似乎从内部调用函数会导致循环过早终止。我尝试在没有函数调用的情况下运行相同的循环,并且console.log()输出计数器,准确地表明函数调用正在打破循环。
有人会建议可能的修复吗?我把代码粘贴在这里:
AbstractModel.prototype.deactivateContext = function(context){
for(i=0;i<this.asset.length;i++){
if(this.asset[i].context == context){
this.asset[i].deactivate();
console.log(i);
this.notify(this.asset[i],"REFRESHASSETS");
}
}
}
答案 0 :(得分:5)
var
不是可选的
您可能在另一种方法中拥有全局i
。将变量声明为正确的范围。
for (var i=0; i<this.asset.length; i++) {
^^^
答案 1 :(得分:3)
请在以下功能中声明我,例如
AbstractModel.prototype.deactivateContext = function(context){
for(var i=0;i<this.asset.length;i++){
if(this.asset[i].context == context){
this.asset[i].deactivate();
console.log(i);
this.notify(this.asset[i],"REFRESHASSETS");
}
}
}
看起来我在通知函数中被修改为更高的数字,当它从通知返回时for
检查正在退出。
答案 2 :(得分:1)
您是否尝试将调用包装到try catch中的notify
函数中。如果您在删除呼叫时说,计数器的输出按预期打印,那么唯一的解释是您的函数抛出异常。试试这个:
for(i=0;i<this.asset.length;i++){
if(this.asset[i].context == context){
this.asset[i].deactivate();
console.log(i);
try {
this.notify(this.asset[i],"REFRESHASSETS");
} catch(e) {
alert(e);
console.log(e);
}
}
}