Javascript:对象如何存储对另一个对象方法的引用,并"远程"调用它?

Ale*_*lex 3 javascript methods eval reference object

所以,我有两个对象,a和b.现在,我想将b的一个方法传递给一个对象,它应该存储它.我们称之为b.met:

b.met=function(){
    alert(this.txt);
}
Run Code Online (Sandbox Code Playgroud)

现在,我想从a调用b.met.以下代码不起作用,因为a.met是a.范围内的b.met的克隆:

a.met=b.met;
a.met(); //Executes in the 'a' scope!
Run Code Online (Sandbox Code Playgroud)

到目前为止,我找到的唯一方法是将方法的名称保存在字符串中并在eval语句中使用它:

a.toCall='b.met';
eval(a.toCall+'();');
Run Code Online (Sandbox Code Playgroud)

既然每个人都说你应该避免使用eval ...还有其他可能性吗?


编辑 - 参见评论:所以我改变了我的代码:

a:{
    processes:[],
    spawnProcess:function(type,id,closeFn){
    var closeFn=closeFn || 'function(){}';
    this.processes.push({type:type,id:id,closeFn:closeFn});
}
Run Code Online (Sandbox Code Playgroud)

至:

a:{
    processes:[],
    spawnProcess:function(type,id,closeFn){
    var closeFn=function(){closeFn()} || 'function(){}';
    this.processes.push({type:type,id:id,closeFn:function(){closeFn()}});
}
Run Code Online (Sandbox Code Playgroud)

执行以下代码时,我收到过多的递归错误:

a.spawnProcess('','',b.met);
a.processes[0].closeFn();
Run Code Online (Sandbox Code Playgroud)

Ray*_*nos 7

您存储对函数的引用.功能只是一个功能.它是this基于调用上下文的定义.

所以如果你存储a.met = b.met然后调用a.met()该函数内部this === a

阅读JavaScript花园this

你想要做的是存储函数和上下文来调用它.

这可以作为

a.met = function() {
  b.met();
}
Run Code Online (Sandbox Code Playgroud)

要么

a.met = b.met.bind(b);

.bind需要ES5.推荐的跨浏览器替代品包括_.bind$.proxy

编辑

你需要改变

a.spawnProcess('','',b.met);

a.spawnProcess('','', function() {
    b.met();
});
Run Code Online (Sandbox Code Playgroud)

你可能也想要这个

a: {
    processes: [],
    spawnProcess: function(type, id, closeFn) {
        this.processes.push({
            type: type,
            id: id,
            closeFn: closeFn || function() {}
        });
    }
}
Run Code Online (Sandbox Code Playgroud)