Javascript js-';这';调用方法时未定义';间接地';

Javascript js-';这';调用方法时未定义';间接地';,javascript,rhino,Javascript,Rhino,我的目标是从函数表中调用一个函数来概括命令处理(即间接地)。不幸的是,这个在这样调用时是未定义的 function Server() { this.sessions = {}; server = this; this.handlers = { "dummy" : server.dummyCommandHandler, }; } Server.prototype.dummyCommandHandler = function() { pri

我的目标是从函数表中调用一个函数来概括命令处理(即间接地)。不幸的是,
这个
在这样调用时是
未定义的

function Server() {
    this.sessions = {};

    server = this;
    this.handlers = {
        "dummy" : server.dummyCommandHandler,
    };
}

Server.prototype.dummyCommandHandler = function() {
    print (this.sessions);
}

Server.prototype.run = function ( command ) {
    print (this.sessions); // [Object object]
    this.handlers[command.name](); // prints 'undefined'
    this.dummyCommandHandler(); // prints '[Object object]'
}

s = new Server();
s.run({ "name": "dummy" });

这是我第一次使用javascript,我认为我已经确定了范围,但显然它比看起来更复杂。使用
Server
变量对服务器的
this
进行别名处理没有任何帮助(我想可能
this
会在
处理程序
对象中进行更改)。当函数被间接调用时,
的作用域是什么?

此的默认行为是它在调用时引用函数作用域(见下文)。您可以通过使用
bind
()或使用箭头函数语法强制执行
this
的值,箭头函数语法将对
this
的引用限定在定义函数的任何位置。这就是我要做的改变:

“dummy”:server.dummyCommandHandler.bind(此),

我看到的第一个问题~
server=this
bad,
var server=this
good
this.handlers[command.name].bind(this)()您的测试环境是什么?我把它复制并粘贴到我浏览器的控制台上,它看起来像预期的那样工作?@Phil啊,感谢Python的帮助……这不会影响这个问题though@hlfrmn或者在构造函数中~
dummy:this.dummyCommandHandler.bind(this)
“this…引用调用时的函数范围”不正确。函数的作用域与作用域无关,它是通过调用或使用bind来设置的(或者从词汇上说是箭头函数,但它们不是OP的一部分)。请参阅。@BihnKim“找不到函数绑定”。Rhino JS似乎不支持这一点,unfortunately@MzyBwy-还有一个。另外,我认为您不再需要“server”变量了。应该能够做到:
“dummy”:this.dummyCommandHandler.bind(this),