javascript - this 并在 Javascript 中将函数作为参数传递

标签 javascript oop

我有以下 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 的值,status 设置为“foo”,但是:

bet=new Beta();
bet.setSomething(a.setStatus);

我所期望的是 bet 将执行 alfsetStatus 函数并将 status 值设置为 ' something',然而,这并没有发生。 alfsetStatus 被执行,但这不是指向 alf 实例而是指向 Window,所以属性状态是为 Window 设置,而不是为 alf 设置。

获得所需功能的正确方法是什么?

这当然是简化的实现,在现实生活中我想将 alf 的那些功能传递给事件处理程序,所以我不能更改 Beta 实现,例如:

$('xxx').click(alf.setStatus)

最佳答案

JavaScript 函数是未绑定(bind)的。这意味着 this 取决于它的调用方式而不是它的定义方式。因为您是从 bet 中调用该方法,所以 thisbet

要解决这个问题,您需要制作一个绑定(bind)函数,无论该函数如何调用,它都会创建一个稳定的this

如果您使用的是兼容 ES5 的 JavaScript 解释器,那么您可以使用:Function.bind

alf.setStatus.bind(alf)

或者,如果您不知道,有几个 es5 填充程序可以在较旧的解释器中提供此功能。事实上,在绑定(bind)的 mdn 引用中提供了一个。 JQuery 有一个名为 $.proxy

的版本

一个简单的实现是您想要一个带有函数和作用域的函数。然后专门在该范围内调用您的方法,而不是使用它。就像是。

function bind(func,o) { return function() { func.call(o); } }

关于javascript - this 并在 Javascript 中将函数作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8961406/

相关文章:

javascript - 使用给定的数据属性动态创建 JavaScript 值?

javascript - 如何使用 HTML 设置在浏览器上播放的视频的结束时间值?

java - 面向对象,传递变量或使用对象状态

delphi - 我可以在 Delphi 中为我自己的类重载运算符吗?

java - 代号一 SQLite 数据问题

javascript - 用于 HTML 表单验证的正则表达式开始时没有空格

javascript - 预期 reducer 是一个函数 - React Native、Redux

javascript - 强制javascript键整数用null填充数组

c++ - 点迭代器的奇怪接口(interface)方法

javascript - OOP - 对象列表上的公共(public)属性