2012-02-12 119 views
-1

所以,我沒有看到爲什麼這不起作用的原因,但我在牆上和沮喪。爲什麼我不能在wyr.message.close函數中調用this.myself?也許我對此的理解是可以理解的,但我確信這是指對象本身,而不是功能。JS對象,如何從我自己內部訪問對象

this.myself is undefined 

代碼:

wyr.message = { 
    myself: $('.message'), 
    init: function() { 
     if(this.myself.is(':visible')){ 
      setTimeout(this.close, 5000); 
     } 
    }, 
    close: function(){ 
     this.myself.fadeOut(1200,function(){ 
      this.myself.remove(); 
     }); 
    } 
} 
+0

您可以添加一個使用示例嗎?目前還不完全清楚你想用'message'來做什麼,並且可能有一種更習慣的方式來實現你的目標。 – 2012-02-13 15:46:59

回答

1
wyr.message = { 
    myself: $('.message'), 
    init: function() { 
     var self = this; 
     if(this.myself.is(':visible')){ 
      setTimeout(function(){ 
       self.close(); 
      }, 5000); 
     } 
    }, 
    close: function(){ 
     this.myself.fadeOut(1200,function(){ 
      $(this).remove(); 
     }); 
    } 
} 

的問題是背景。在傳遞給fadeOut的回調函數中,this綁定到jQuery正在處理的元素,而不是綁定到wyr.message對象。

編輯

還有與init方法的問題。 SetTimeout將把this的值綁定到全局(window)對象 - 因此我們保存對我們想要的this的引用,並使用它來調用close方法。

您也可以查看Function.prototype.bind,但舊版瀏覽器不支持它。

+0

argh f * ck你當然是天才。傻我歡呼 – 2012-02-12 22:02:11

+0

這個說。我現在在this.myself.fadeOut上得到了同樣的錯誤。不太清楚如何解決問題。它是未定義的。 – 2012-02-13 00:34:45

+0

哦,對。我的錯。甚至沒有看到'init'方法......這裏也有一個上下文問題。我編輯了我的答案。 – 2012-02-13 01:29:03

0

首先,javascript對象文字屬性表達式在您創建對象實例時進行評估。 myself將成爲那個選擇器在那個時候捕獲的東西,這可能不算什麼。如果您希望在調用時返回值$('.message'),則myself屬性需要是一個函數。因此,您還需要將所有用途更改爲函數調用。

二,setTimeout的回調的執行過程中,this被綁定到窗口對象,所以你需要適當地限定它:

wyr.message = { 
    myself: function() { return $('.message'); }, 
    init: function() { 
     if(this.myself().is(':visible')){ 
     setTimeout(this.close, 5000); 
     } 
    }, 
    close: function(){ 
     message.myself().fadeOut(1200,function(){ 
     $(this).remove(); 
     }); 
    } 
    }; 

(注意,這將淡出,並刪除所有選擇匹配當超時觸發時)。