2013-04-07 81 views
1

這是代碼片段,這讓我困惑:的JavaScript綁定問題

var timer = 
{ 
    start: function() 
    { 
     var self = this; 

     /*Why the code below doesn't write to this: 
      window.setInterval(self.tick, 1000).*/ 

     //Instead, it embedded into a function like this: 
     window.setInterval(function(){self.tick();}, 1000) 
    }, 
    tick: function() 
    { 
     console.log("tick!"); 
    }  
} 

timer.start(); 

回答

2

原因是JavaScript的this是動態的。當你調用一個函數,如:

object.func(); 

this將被設置爲object。然而,當你清楚地調用一個函數:

func(); 

或者將它傳遞給其他的一些功能(包括setInterval),this將被設置爲全局對象(window,通常情況下)。

因此,當你只是通過self.ticksetInterval,那麼tickthis將是全局對象,而不是timer。當你通過function() { self.tick(); }時,它是selftimer)。

這裏,這都沒有區別,因爲tick不訪問this,但如果tick訪問this,你可能想使用function() { self.tick(); },因爲否則的話,你會被修改全局對象,而不是timer的性能。

1

function(){self.tick();}更容易比self.tick後來擴大。這與使用大括號(或不包含)圍繞僅包含一條語句的if塊之間的差異有點類似。

+0

爲什麼稍後沒有人會將其添加到'tick'而不是? – icktoofay 2013-04-07 03:22:04

+0

因爲也許'tick'可以在其他地方使用。 – 2013-04-07 03:26:05

0

我們使用的另一個原因:window.setInterval(function(){self.tick();}, 1000)是符合「單一責任」的設計原則。 tick()應該只做1個工作:打勾。如果你需要在計時器觸發時做更多的工作,你應該編寫另一個函數,並在事件處理程序中調用它,而不是修改tick()。例如:

window.setInterval(function(){ 
    self.tick(); 
    self.notify(); 
    ..... 
    }, 1000)