2015-08-15 77 views
0

PlayerTracker.js:Node.js的模塊 「這」 重置

var util = require('util'); 
var PlayerTracker = function(GameServer, pos) { 
    this.gs = GameServer; 
    this.pos = pos; 
    this.left = false; 
    this.right = false; 
    console.log("constructor" + util.inspect(this)); 
}; 

PlayerTracker.prototype.getPos = function() { 
    return this.pos; 
}; 

PlayerTracker.prototype.setPos = function() { 
    return this.pos; 
}; 

PlayerTracker.prototype.setLeft = function(left) { 
    this.left = left; 
}; 
PlayerTracker.prototype.setRight = function(left) { 
    this.right = left; 
}; 

PlayerTracker.prototype.moveTick = function() { 
    console.log(util.inspect(this)); 
    if (this.left) { 
    if (this.pos <= 0) { 

    } else { 
     this.pos--; 
     this.left = false; 
    } 
    } else if (this.right) { 
    if (this.pos >= 10) { 

    } else { 
     this.pos++; 
     this.right = false; 
    } 
    } 
}; 
module.exports = PlayerTracker; 

在開始時,我得到:

constructor{ gs:  
{ config: { serverPort: 1010, testValue: 0 }, 
socketServer: 
    { domain: null, 
    _events: [Object], 
    _maxListeners: undefined, 
    _server: [Object], 
    _closeServer: [Function], 
    options: [Object], 
    path: null, 
    clients: [Object] } }, 
    pos: 5, 
    left: false, 
    right: false } 

但後來經過我打電話MoveTick,我得到:

{ _idleTimeout: 500, 
_idlePrev: null, 
_idleNext: null, 
_idleStart: 4060813, 
_onTimeout: [Function: wrapper], 
_repeat: true } 

它看起來像這個varibale重置。 我只是打開它var playerTracker = new PlayerTracker(this,5) 並與setInterval(playerTracker.moveTick,500) 打電話給我只是想保持的位置等。 你知道有什麼原因嗎?

回答

1

你要麼需要做的:

setInterval(function(){playerTracker.moveTick()},500); 

或:

setInterval(playerTracker.moveTick.bind(playTracker),500); 

這是因爲在JavaScript this的價值取決於你如何調用該方法。

當你這樣做:

setInterval(playerTracker.moveTick,500); 

你真正做的是:

var x = playerTracker.moveTick; 
setInterval(x,500); 

因此setInterval正在召喚你的功能,而不playTracker對象。在這種情況下,moveTick函數被稱爲常規函數。並根據天氣或沒有你在嚴格模式this是未定義的或全局對象(window在瀏覽器中)。

看到這個相關答案一個完整的(和及時更新)的說明如何this作品:How does the "this" keyword in Javascript act within an object literal?

+0

你需要使用括號在你的第一個選項......'setInterval(function(){playerTracker.moveTick()},500);' – user1936097

+0

@ user1936097:感謝您發現! – slebetman

0

當你調用setInterval(playerTacker.moveTick, 500)正在發生的事情是函數moveTick被稱爲在不同的環境後, 500ms,並且this的值將是一個指向可能是間隔超時控制器的對象。

,使其運行爲你打算,你需要確保該函數是在類PlayerTracker

的正確實例的上下文中運行試試這個: setInterval(function(){playerTracker.moveTick()}, 500)