我在调试时非常糟糕,并且完全不知道为什么这不起作用。这是我的情况:
我写了一个函数来打开几个标签链接,然后对它们执行一个非常简单的操作。它没有像我预期的那样工作,所以我重新编写它只是打开一个链接到一个选项卡,这是有效的。这就是我所拥有的(简化):
links=arrayFromGetElemenetsCall;
if(condition){
theNewWindow=window.open(links[0]);
}
setTimeout("myFunction(theNewWindow)",5000);
}
function myFuntion(bob){
bob.doStuff();
}
当我尝试打开多个选项卡并将窗口引用保存到数组中以备将来使用时,我收到错误。这是多个窗口的简化代码:
var theArray=new Array();
links=arrayFromGetElemenetsCall;
for(conditions){
if(condition){
theArray[i]=window.open(links[i]);
}
}
setTimeout("myFunction(theArray[0])",5000);}
function myFuntion(bob){
bob.doStuff();
}
哪个不起作用。我得到“错误:未定义theArray”当且仅当它被写入setTimeout函数时。我试过传递整个数组然后在myFunction中循环以及在bob [0]上调用.doStuff()。
我在这里看不到的是什么?
答案 0 :(得分:2)
让人惊讶。首先,摆脱将字符串作为setTimeout
和setInterval
的第一个参数传递的习惯。 setTimeout
将隐式使用eval来执行该字符串,eval is evil。
在这种情况下,秘密评估也是导致逻辑错误的原因。该片段不足以精确诊断您的问题,但基本上在eval范围内,未定义阵列。使用闭包的重写是一种可能的方法:
setTimeout(function(obj){
return function(){
myFunction(obj);
}
}(theArray[0]), 5000);
答案 1 :(得分:2)
(所有体面的浏览器都有弹出窗口阻止程序,可能会阻止您打开多个新窗口。)
您需要更改以下内容:setTimeout("myFunction(theArray[0])",5000);}
成:
setTimeout(function(){
myFunction(theArray[0]);
}, 5000);
这样,阵列将在范围内。将字符串传递给setTimeout可能会在浏览器的window
范围内运行该代码。
答案 2 :(得分:0)
这是你想要做的吗?我在我的firebug控制台上尝试了这个,并在两秒后打印出“我有40个”。
var theArray = new Array();
for(var i = 0; i < 10; i++) {
theArray[i] = i * 10;
}
setTimeout("func(theArray[4])", 2000);
function func(val) {
console.log("I have " + val);
}