2013-04-12 3 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 -функции следует использовать значение nowTime и lastClick от моего button -объекта, но они неопределенных. Кто-нибудь может мне помочь?

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

Смежные вопросы