2013-02-26 39 views
0

我有一個從數組綁定函數到某些元素的問題,但是當我點擊類「class」的任何元素後,出現此錯誤。如何控制變量提升?

Uncaught TypeError: Property '4' of object function(){alert(1)},function(){alert(2)},function(){alert(3)},function(){alert(4)} is not a function

var c = [ 
    function(){alert(1)}, 
    function(){alert(2)}, 
    function(){alert(3)}, 
    function(){alert(4)} 
]; 

function test(b){ 
    for(var i = 0; i < b.length; i++){ 
     $('.class').eq(i).bind('click', function(){ 
      b[i](); 
     }); 
    } 
} 

test(c); 

我認爲變量i保持其最後的值。

任何解決方案或解釋將非常感激。 在此先感謝。

+4

這不是吊裝。這就是範圍。 – Bergi 2013-02-26 20:10:07

+1

試試這個:'$('。class')。eq(i).bind('click',b [i]);' – 2013-02-26 20:11:18

+0

你的數組只有4個索引(0,1,2,3)是第五個索引是未定義的,這意味着你的循環必須走得太遠,儘管我不立即明白爲什麼。儘管如此,你的索引有一個範圍問題。您的單擊事件b [i]()將始終調用數組中的最後一個函數。 – 2013-02-26 20:12:14

回答

1

您的函數數組只有4個項目,所以b[4]未定義。而不是引用b你的點擊處理程序中的,使其單擊處理本身:

elems.eq(i).on('click', b[i]); 

通過該做的i值將被審查通過循環每次迭代,而不是被點擊的元素時(此時其值應始終爲4)。

+0

但是,'b [4]'怎麼叫? – 2013-02-26 20:14:00

+0

@RocketHazmat我明白爲什麼'i'設置爲'4'。我仍然認爲我的回答指向*爲什麼* op看到了這個錯誤。 – Madbreaks 2013-02-26 20:15:10

+0

@RocketHazmat我加了一條關於如何解決這個問題的建議。 – Madbreaks 2013-02-26 20:17:39

2

你需要一個閉包 - 在js變量範圍內由函數決定。使用jQuery,只需使用.each

$('.class').each(function(i) { 
    $(this).on('click', function(){ 
     alert(i+1); 
    }); 
}); 

但是,如果你真的需要有不同的功能數組,你正好可以作爲處理程序直接綁定函數本身:

var elems = $('.class'); 
for (var i=0;i<b.length;i++) { 
    elems.eq(i).on('click', b[i]); 
} 
+0

非常感謝你的幫助。 – misoukrane 2013-02-26 20:27:23

1

的問題是,在你的循環你設置的功能爲click處理程序都是共享相同的i值。循環後,i值將爲4,因此每個函數都會嘗試呼叫b[4],這不存在。

您需要爲每個函數創建一個新的作用域,以使i的值全都不同。

for(var i = 0; i < b.length; i++){ 
    (function(i){ 
     $('.class').eq(i).bind('click', function(){ 
      b[i](); 
     }); 
    }(i)); 
} 

您也可以單純從陣列直接作爲click處理程序中設置的功能。

for(var i = 0; i < b.length; i++){ 
    $('.class').eq(i).bind('click', b[i]); 
}