javascript函数指针和“;这个“;
javascript function pointer and "this"
使用jsPlumb绑定,我将一个方法作为变量传递,用作回调。当它被调用时,"this"不是该方法所属的对象。如何访问方法的对象实例,以便访问它的变量和其他成员函数?
我无法控制回调调用方法,它是一个单独的库。我所做的就是从我的对象init方法调用绑定。我本来希望_connection
方法中的this
是它的对象。
jsPlumb.bind('connection', this._connection);
任何function
的this
值都是在调用时确定的。function
实际上与"对象"没有其他联系,只是它是否被称为object.method()
或method.call(object)
。
因此,要传递具有固定this
值的function
,需要绑定:
jsPlumb.bind('connection', this._connection.bind(this));
jQuery还包括一个包装器和与jQuery.proxy()
:的兼容性填充
jsPlumb.bind('connection', $.proxy(this._connection, this));
如果您不想使用Function.prototype.bind(因为旧浏览器不支持它)并且不想使用jquery,则更复杂的版本是:
jsPlumb.bind('connection', (function(me){
return function(){
me._connection();// no need for call, apply or bind
}
})(this));
在传递对象方法时丢失this
是一个常见的问题,以下是在脚本中重新生成的问题及其解决方案:
var ps={//publish subscribe
messages:{},
add:function(m,fn){
if(!this.messages[m]){
this.messages[m]=[];
}
this.messages[m].push(fn);
},
publish:function(m,data){
var i = 0;
var msg=this.messages[m];
for(i=0;i<msg.length;i++){
msg[i](data);
}
}
}
function test(){
}
test.prototype.logit=function(data){
console.log(data,this.toString());
};
test.prototype.toString=function(){
return "This is a test object";
}
// self made bind function
function myBind(me,fn){
return function(){
fn.apply(me,arguments);
}
}
var t=new test();
// pass a closure instead of a function
ps.add("test1",(function(me){
return function(data){
me.logit(data);
}
})(t)
);
// pass a function
ps.add("test2",t.logit);
// function created with bind
ps.add("test3",t.logit.bind(t));
// passing closure using myBind
ps.add("test4",myBind(t,t.logit));
// next line will log "This is a test object"
ps.publish("test1","Passing a closure instead of the function, this is:");
// next line will log "function (data){console.log(..."
// so `this` is not test but test.logit
ps.publish("test2","Passing a the function, this is:");
// next line will log "This is a test object"
ps.publish("test3","Passing a the function using bind, this is:");
// next line will log "This is a test object"
ps.publish("test4","Passing a closure with myBind, this is:");
相关文章:
- 为什么这个函数调用会破坏程序并导致未定义的变量
- 可以'我搞不清楚这个函数是怎么工作的
- 这个函数做什么以及如何在没有'带有'语句-Javascript
- 如何在 jquery 中循环这个函数
- 我能把这个函数一分为二吗
- JavaScript 新手:我可以将列表传递到这个函数中并让它仍然工作吗?
- JavaScript:return WebForm_FireDefaultButton();这个函数在做什么,我该如何复
- 我怎样才能重写这个函数,这样我就不会'不必显式地键入范围内的每个IP地址
- 为什么这个函数执行了两次
- HTML JavaScript,我如何能够通过给每个元素一个不同的Id来使用JavaScript使这个函数工作
- 为什么获胜't这个函数给我元素的名称it's绑定到
- 有人能向我解释一下为什么我们在这个函数中需要一个for循环吗
- 怎么能做这个函数纯
- 对我来说,用javascript设置这个函数最有效的方法是什么
- 为什么这个函数在JS中返回undefined.property
- 为什么这个 setTimeout() 方法在这个函数中不起作用
- 什么'It’这个函数现在正在运行
- 为什么图像选择器程序中的这个函数 js 不起作用
- 为什么我必须绑定这个函数参数
- 为什么这个函数不能无限循环