[英]this and passing function as parameter in Javascript
我有以下Javascript对象:
function Alfa() {
this.status='';
this.setStatus = function(value) {
this.status=value
}
}
function Beta() {
this.setSomething = function(setter) {
setter('Something');
}
}
而不是执行:
alf=new Alfa();
alf.setStatus('foo');
这很好,如果你查看alf的值, 状态设置为'foo',但是:
bet=new Beta();
bet.setSomething(a.setStatus);
我所期望的是, bet将执行alf的 setStatus函数并将状态值设置为'something',但是,这不会发生。 执行alf的 setStatus ,但是这不是指向alf实例而是指向Window ,因此为不为alf设置Window的属性状态。
获得所需功能的正确方法是什么?
这当然是简化的实现,在现实生活中我想将alf的那些函数传递给事件处理程序,所以我不能改变Beta实现,例如:
$('xxx').click(alf.setStatus)
JavaScript函数未绑定。 这意味着this
取决于它是如何调用的,而不是它是如何定义的。 因为你是在bet
内调用方法,所以this
是bet
为了解决这个问题,你需要做一个绑定的功能 ,它创建了一个稳定的this
无论功能如何调用。
如果您使用的是兼容ES5的JavaScript解释器,则可以使用: Function.bind
alf.setStatus.bind(alf)
或者,如果你不是有几个es5垫片,在旧的解释器中提供此功能。 事实上,在mdn引用上提供了一个bind。 JQuery有一个名为$.proxy
的版本
一个简单的实现是你需要一个带有函数和范围的函数。 然后专门在该范围内调用您的方法,而不是使用它。 就像是。
function bind(func,o) { return function() { func.call(o); } }
JavaScript中的函数没有附加到它们的上下文,例如Python中的绑定方法。 所以你可以做的是用上下文调用setStatus函数,如下所示:
bet.setSomething(function(value) {
a.setStatus.call(a, value);
});
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call
改变setter('Something');
to setter.call(this, 'Something');
会工作。
function Alfa() {
this.status='';
this.setStatus = function(value) {
this.status=value
}
}
function Beta() {
this.status='';
this.setSomething = function(setter) {
setter.call(this,'Something');
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.