2016-05-15 77 views
1

我有一個項目,我正在努力,我設法做出最短的代碼來處理我想要在網站上執行的某個動作的問題(在這種情況下,在特定時間之後點擊很多按鈕) This是我的結果至今:如何在JavaScript中的單個循環中轉換多個?

if (myvar == i) { 
     setTimeout(function() { 
     $('.class.' + i).children('.BUTTON').click(); 
     }, time * i); 
    } 

這將是驚人的,如果我可以使用一個循環吧,因爲你可以看到有很多類在那裏具有相同的名稱,和我使用的setTimeout放緩所以網站可以理解我在「點擊」它的按鈕 因此,現在,許多如果數字而不是「我」的作品很好,但我知道那裏有一個更好的辦法,問題是如果我實現任何類型的循環腳本中斷;(建議?

+0

的其他代碼已經> = i到清楚,就是這樣它爲inexistant按鈕未搜索的最後一個。 – TweakFix

+0

「因爲你可以注意到有很多類在那裏有相同的名稱」......你沒有發佈任何HTML或鏈接到例子,所以我們怎麼能注意到?閱讀[mcve] – yezzz

回答

2

如果我猜測正確,那麼這是你可能已經嘗試過:

for (var i = 0; i < 100; i++) { 

    setTimeout(function() { 

     $('.class.' + i).children('.BUTTON').click(); 

    }, time * i); 

} 

它並沒有因爲異步特性的JavaScript由於其工作的setTimeout沒有按回調」 t立即執行。這對你的目的有好處,但每次你撥打setTimeout時,它的回調實際上是指相同的迭代器i(歸因於lexical-scoping)。

這樣當回調是執行實際上,每個回調現指相同i(與相同值),因此,所有的按鈕同時獲得點擊。

此問題也可歸因於lexical-scoping優於block-scoping的JavaScript。但是,我們知道在JavaScript中的function也表現爲塊範圍構造(實際上它是塊範圍內的唯一JavaScript)。因此,我們將使用這樣的:

for (var i = 0; i < 100; i++) { 

    (function(i) { // IIFE starts 

     setTimeout(function() { 

      $('.class.' + i).children('.BUTTON').click(); 

     }, time * i); 

    })(i); // <-------IIFE ends 

} 

我在這裏做什麼叫做IIFE(立即調用函數表達式)。 IIFE是一個函數表達式,當程序控制達到它時立即執行。而且由於函數在javascript中是一個塊範圍,因此傳遞給它的變量i將成爲其作用域的成員(由於按值傳遞),因此不再依賴於外部循環的i

所以基本上我們在IIFE內創建了一個新的i。並且對於每個IIFE,值i是不同的。


這裏有一個簡單的例子:

與IIFE

for (var i = 0; i < 100; i++) { 

    (function(i) { // IIFE starts 

     setTimeout(function() { 

      console.log(i); // <----- simply printing the iterator i 

     }, 500); 

    })(i); // <-------IIFE ends 

} 

OUTPUT:

0 
1 
2 
3 
... (upto 99) 

WITHOUT IIFE:

for (var i = 0; i < 100; i++) { 

     setTimeout(function() { 

      console.log(i); // <----- simply printing the iterator i 

     }, 500); 

} 

OUTPUT:

100 
100 
100 
... (100 times) 
相關問題