2015-08-15 47 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)