2012-04-24 55 views
1

我在做這樣的事情:請參閱「這種」自定義變量

var talkAPI = { 
    init: function(){ 
     setInterval(function(){ 
      this.speak(); 
     },1000); 
    }, 
    speak: function(){ 
     //Something else 
    } 
}; 

然而,我發現這是行不通的,因爲我的預期。所以我做了一些測試,並且我發現setInterval中的this指的是Window。這不是我想要的。那麼我該如何重新參考thistalkAPI?因爲我不想這樣做:

setInterval(function(){ 
    window.talkAPI.speak(); //Not so good 
},1000); 
+1

爲什麼不直接使用'talk.speak()'?與'this.speak()'相同的長度並且更可靠;) – 2012-04-24 22:43:46

+2

@Kolink - 它取決於對象 – Quentin 2012-04-24 22:45:31

+0

@ T.J.Crowder這是一個錯字。 – 2012-04-24 22:49:16

回答

5

您需要保存原始this用於回調

init: function() { 
    var self = this; 
    setInterval(function(){ 
     self.speak(); 
    },1000); 
}, 
+1

確實,這是簡單而簡單的方法。另外值得一提的是新的ES5功能['Function#bind'](http://es5.github.com/#x15.3.4.5)。有些理論是好的,比如:[*您必須記住'this' *](http://blog.niftysnippets.org/2008/04/you-must-remember-this.html)。 ;-)(免責聲明:鏈接到我的博客,但它沒有廣告。) – 2012-04-24 22:53:10

+0

是的,這可能是最簡單的方法。謝謝。 – 2012-04-24 22:56:58

+0

@ Derek:實際上,在這個特定的例子中,最簡單的方式就是Kolink在他的評論中提到的方式,因爲在這個特殊情況下,你正在處理一個單例對象。但是Jared的回答就是你通常這樣做的方式,在'init'函數可能被多個對象共享的情況下 - **和**它也可以與singletons一起工作*,所以這是我們大多數人可能會做的方式它,爲了將來打樣,只是因爲這個成語很熟悉。 – 2012-04-24 23:03:05

2

的問題是,在JavaScript中,this完全由如何定義函數被調用,而不是它被定義的位置(因爲它是用其他語言使用該關鍵字)。所以setInterval調用你給它的函數的方式,this沒有設置爲任何特定的(因此默認爲全局對象,在瀏覽器上是window)。更多在這裏:You must remember this

隨着你所引用的代碼,你有兩個選擇:

  1. 由於Kolink評論,因爲你的對象是單身主義者和init函數關閉在talkAPI變量,沒有任何理由,你不能只使用talkAPI

    var talkAPI = { 
        init: function(){ 
         setInterval(function(){ 
          talkAPI.speak(); // <=== Only change is here 
         },1000); 
        }, 
        speak: function(){ 
         //Something else 
        } 
    }; 
    
  2. 更普遍的答案,這都與單身人士和與結構創建的對象的工作原理或功能,例如,是保存的this值,as described by JaredPar

    var talkAPI = { 
        init: function(){ 
         var self = this;  // <=== Create a variable to close over 
         setInterval(function(){ 
          self.speak(); // <=== Use it 
         },1000); 
        }, 
        speak: function(){ 
         //Something else 
        } 
    }; 
    

在這兩種情況下,該功能有一個持久的,活鏈接到他們關閉了符號,這就是爲什麼他們可以使用他們。以這種方式綁定數據的函數被稱爲關閉。更多信息:Closures are not complicated

+1

'這個'非常棘手! :P感謝您的答覆。 – 2012-04-24 23:02:44

+0

@Derek:很高興。 :-) – 2012-04-24 23:04:34