這是在JavaScript中非常常見的錯誤。我想包括我在內的每個人都曾經這樣做過。不過,這很容易理解。
這是怎麼回事
當你調用一個函數作爲對象的方法,您可以設置其背景對象。這意味着這個函數裏面的this
會指向你的上下文對象。
MyObject = {};
MyObject.someValue = 1;
MyObject.myMethod = function() {
console.log(this.someValue); // This will log "1" to the console, as expected
};
現在出現棘手的部分:您可以更改函數的上下文。讓我們添加一些代碼多行這裏:
MyOtherObject = {};
MyOtherObject.someValue = 2;
MyOtherObject.myMethod = MyObject.myMethod;
現在,當您打電話MyOtherObject.myMethod
調用相同的功能,如果你會叫MyObject.myMethod
,但在一種情況下this
點MyObject
而在其他情況下,它指向MyOtherObject
。
現在,當你調用setInterval(MyObject.myMethod, 1000)
,功能方面將被設置爲window
(技術上,setInterval
電話window.setInterval
),並自window
沒有一個屬性調用someValue
,它只會是不確定的。
如何修復
爲了解決這個問題,你可以創建另一個引用您的LoginScreen對象。它將始終指向整個範圍內的相同對象,除非您更改它。然後,您可以使用它作爲this
的替代選項,而不用擔心上下文。
function LoginScreen() {
this.IntervalID = null;
this.counter = 0;
// Create another reference to "this"
var self = this;
this.Start = function() {
// The function behind "this.Update" will always be called with "window"
// as its context.
this.IntervalID = window.setInterval(this.Update, 60/1000);
};
this.Stop = function() {
// This function is called as "self.Stop", therefore "this" points to
// "self", which points to the right object, so you can use "this".
clearInterval(this.IntervalID);
};
this.Update = function() {
// Inside this function, "this" points to "window".
// You therefore have to use the previously declared "self"
// to point to the right object.
self.counter++;
alert(self.counter);
if (self.counter > 5) self.Stop();
};
}
LS = new LoginScreen();
LS.Start();
另外參考
this - Mozilla Developer Network的此在JavaScript中beviour的另一說明中,用一些函數來控制它沿。
您是否試圖循環每一分鐘?如果是這樣,請檢查'setInterval()'參數。 – Jared
我不在乎它多久循環一次,我的間隔實際上是每秒60次,但這個時候與這個問題無關 –