2013-04-30 19 views
1

如果intervalIsClear爲true,則hoveredItemIndex正在拾取LI元素的索引。爲什麼變量在setTimeout封裝時不能通過

如果intervalIsClear爲false,則hliedItemIndex在setTimeout()內聲明,但返回-1。爲什麼找不到索引一旦包含在setTimeout()中?

function() 
       { 
        if (intervalIsClear == true){ 

         hoveredItemIndex = $('.menu li').index(this); 
         changeToHoverText(); 
        } else { 
         hello = setTimeout(function(){ 
          hoveredItemIndex = $('.menu li').index(this); 
          alert (hoveredItemIndex); 
          changeToHoverText(); 
         },500); 
        } 
       } 

回答

4

這是因爲當該函數執行回調setTimeout時,該方法的執行上下文被改變。這意味着this回調內外setTimeout指向不同的對象。

使用$.proxy手動指定一個回調方法的執行上下文

function() { 
    if (intervalIsClear == true) { 

     hoveredItemIndex = $('.menu li').index(this); 
     changeToHoverText(); 
    } else { 
     hello = setTimeout($.proxy(function() { 
      hoveredItemIndex = $('.menu li').index(this); 
      alert(hoveredItemIndex); 
      changeToHoverText(); 
     }, this), 500); 
    } 
} 
+0

偉大的答案只是缺少一些大膽的;) – 2013-04-30 13:21:47

2

setTimeout回調this不一樣與外界。

你需要做的事:

   var that = this; 
       hello = setTimeout(function(){ 
        hoveredItemIndex = $('.menu li').index(that); 
        alert (hoveredItemIndex); 
        changeToHoverText(); 
       },500); 
4

因爲執行上下文中你setTimeout功能發生了變化。在javascript中記住,this關鍵字是函數執行的上下文。在你的情況下,this對象是window對象。

var self = this; 

    if (intervalIsClear == true){ 
     hoveredItemIndex = $('.menu li').index(this); 
     changeToHoverText(); 
    } else { 
     hello = setTimeout(function(){ 
      hoveredItemIndex = $('.menu li').index(self); 
      alert (hoveredItemIndex); 
      changeToHoverText(); 
     },500); 
    } 

所以叫setTimeout()像你上面,你實際上在做這個window.setTimeout()

+1

_「這個」呈現出FUNCTION_的調用對象的上下文是虛假陳述 – artistoex 2013-04-30 13:17:19

+0

有保持特定.proxy $上下文,請參閱@Arun P Johny的答案。也許封閉也可以使用。 – 2013-04-30 13:20:39

相關問題