我创建了一个带有函数的对象,该函数使用'this'关键字引用自身的属性。
如果我称它为正常,它可以正常工作。但是,如果我调用它作为forEach函数中的参数传递它,除非我将它绑定到自身,否则它不起作用。
有更优雅的解决方案吗?
以下是一个例子:
var foobar = {
foo : function (number) {
this.bar();
},
bar : function () {
return "string"
}
};
foobar.foo(0);
[1,2,3].forEach(foobar.foo); //won't work
[1,2,3].forEach(foobar.foo.bind(foobar)); //works
答案 0 :(得分:6)
@Christos提供了a good explanation发生这种情况的原因。但是,回答您的问题,更优雅的解决方案将foobar
传递为thisArg
of forEach
:
[1, 2, 3].forEach(foobar.foo, foobar);
如果向
thisArg
提供forEach
参数,则会将其传递给 调用时的回调,用作其this
值。否则, 值undefined
将被传递以用作其this
值。 确定最终可通过回调观察到的this
值 根据{{3}}。
DEMO: the usual rules for determining the this seen by a function
答案 1 :(得分:2)
有更优雅的解决方案吗?
我认为没有更优雅的解决方案。
为什么会这样?
由于context
的变化,会发生这种情况。
forEach(foobar.foo)
this
并未使bind
引用foobar的实例。
另一方面,调用this
方法明确设置{{1}}指向的位置
这将指向foobar的实例。
来自MDN:
bind()函数用。创建一个新函数(一个绑定函数) 相同的函数体(ECMAScript 5术语中的内部调用属性)as 它被调用的函数(绑定函数的目标 function)将此值绑定到bind()的第一个参数, 无法覆盖。 bind()也接受前导默认值 绑定函数时提供给目标函数的参数 调用。也可以使用new来构造绑定函数 运算符:这样做就像目标函数一样 建造。提供的此值将被忽略,而前置 参数被提供给模拟函数。