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)
您存储对函数的引用.功能只是一个功能.它是this基于调用上下文的定义.
所以如果你存储a.met = b.met然后调用a.met()该函数内部this === a
你想要做的是存储函数和上下文来调用它.
这可以作为
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)