2010-02-03 87 views
1

我在調試時非常可怕,並且完全不知道爲什麼這樣做不起作用。這是我的情況:打開幾個選項卡,然後在所述選項卡上執行操作

我寫了一個函數打開多個鏈接到標籤中,然後對它們執行一個非常簡單的操作。它沒有像我預期的那樣工作,所以我重寫了它,只是打開一個鏈接到一個標籤中,這個標籤工作正常。這是我(簡化):

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(); 
} 

哪一個不起作用。當且僅當它被寫入setTimeout函數時,我會得到「Error:theArray is not defined」。我試過傳遞整個數組,然後在myFunction中循環,以及在bob [0]上調用.doStuff()。

這是什麼,我沒有看到這裏?

回答

2

是的。首先,擺脫傳遞字符串作爲setTimeoutsetInterval的第一個參數的習慣。 setTimeout將隱式使用eval來執行該字符串,並且eval is evil

在這種情況下,祕密eval也是您的邏輯錯誤的原因。該片段不足以精確診斷您的問題,但基本上在eval範圍內,Array沒有被定義。使用封閉的改寫是一個可行的方法:

setTimeout(function(obj){ 
    return function(){ 
     myFunction(obj); 
    } 
}(theArray[0]), 5000); 
+0

謝謝,就是這樣。 – baiano 2010-02-04 04:52:47

0

這是你想要做的嗎?我在我的螢火蟲控制檯上試了一下,兩秒後打印出「我有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); 
} 
2

(所有的體面的瀏覽器有彈出窗口攔截器,這將很可能從打開多個新窗口阻止你。)

你想改變以下:setTimeout("myFunction(theArray[0])",5000);}

到:

setTimeout(function(){ 
    myFunction(theArray[0]); 
}, 5000); 

這樣theArray將在範圍之內。將字符串傳遞給setTimeout可能會在瀏覽器中運行window範圍內的代碼。

+0

這樣做。我知道這會是那樣簡單的事情......你太棒了。 – baiano 2010-02-04 04:51:56

相關問題