繁体   English   中英

这个和传递函数作为Javascript中的参数

[英]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内调用方法,所以thisbet

为了解决这个问题,你需要做一个绑定的功能 ,它创建了一个稳定的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM