2013-04-12 55 views
0

JS-folks, 我有一個小測試腳本的問題。在一個對象中的函數

我有這個JS:

var button = { 
    lastClick: 0, 
    nowTime: new Date().getTime(), 
    go: function() { 
     var diff = this.nowTime - this.lastClick; 
     if (diff < 3000) alert('Too fast:' + diff/1000); 
     lastClick = this.nowTime; 
    }.bind(this) 
}; 

而這個HTML:

<input type="button" value="Go" onClick="button.go();" /> 

go - 函數應該使用nowTimelastClick值從我button -object但他們未定義。有誰能夠幫助我?

JS-Fiddle

回答

3

這是因爲this是不確定的,當你做出的綁定(所以你結合window)。

你可以這樣做:

var button = { 
    lastClick: 0, 
    nowTime: new Date().getTime() 
}; 
button.go = function() { 
    var diff = this.nowTime - this.lastClick; 
    if (diff < 3000) alert('Too fast:' + diff/1000); 
    this.lastClick = this.nowTime; 
}.bind(button); 

你也是一個this.lastClick失蹤。

另一種方法是使用一個封閉件/工廠:

var button = (function(){ 
    var lastClick = 0; 
    var nowTime = new Date().getTime(); 
    return { 
    go: function() { 
     var diff = nowTime - lastClick; 
     if (diff < 3000) alert('Too fast:' + diff/1000); 
     lastClick = nowTime; 
    } 
    } 
})(); 

差(其可以是或不適合你一個好處)是,按鈕的內部狀態被隱藏在這個版本(字段通常被認爲是「私人的」)。

如果你想nowTime始終是當前的時間,不存儲它:

var button = (function(){ 
    var lastClick = 0; 
    return { 
    go: function() { 
     var nowTime = new Date().getTime(); 
     var diff = nowTime - lastClick; 
     if (diff < 3000) alert('Too fast:' + diff/1000); 
     lastClick = nowTime; 
    } 
    } 
})(); 
+0

這是沒有必要button'和'button.go'的'定義分開,是嗎?此外,'bind'在這裏也不是必需的。我想知道alexP是不是用''this'作爲'bind'的參數來引用別的東西。 – MaxArt

+0

@MaxArt綁定是必要的,如果你想要做的話,例如'setTimeout(button.go,100);'。 –

+0

似乎可行,但現在'lastClick'每次點擊都等於'nowTime'。但'nowTime'應該使用'getTime()'http://fiddle.jshell.net/8u4Du/5/ – alexP

相關問題