2013-04-12 2 views
0

JS- 사람들, 작은 테스트 스크립트에 문제가 있습니다.개체의 함수

내가있어이 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 α- 함수 내 button -object에서 nowTimelastClick 값을 사용해야하지만이 정의되지 않은 입니다을. 아무도 나를 도울 수 있습니까? 당신이 바인딩 (그래서 당신은 window에 결합하는 것) 할 때 this이 정의되어 있기 때문이다

JS-Fiddle

답변

3

.

이 작업을 수행 할 수 있습니다 당신은 또한 this.lastClick 전에 누락 된

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); 

. (버튼의 내부 상태가이 버전에서 숨겨져 있다는 필드를

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가'bind'의 인수로'this'를 가진 다른 것을 참조하지 않는지 궁금합니다. – MaxArt

+0

예를 들어'setTimeout (button.go, 100);'과 같이 @MaxArt 바인드가 필요합니다. –

+0

작동하는 것으로 보이지만 모든 클릭에 대해'lastClick'은'nowTime'과 같습니다. 그러나 nowTime은'getTime()'을 사용해야합니다 http://fiddle.jshell.net/8u4Du/5/ – alexP

관련 문제