JS绑定对象函数调用自身

时间:2015-01-15 12:48:44

标签: javascript

我创建了一个带有函数的对象,该函数使用'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

小提琴:http://jsfiddle.net/q29yatc2/

2 个答案:

答案 0 :(得分:6)

@Christos提供了a good explanation发生这种情况的原因。但是,回答您的问题,更优雅的解决方案foobar传递为thisArg of forEach

[1, 2, 3].forEach(foobar.foo, foobar);

Documentation说:

  

如果向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来构造绑定函数   运算符:这样做就像目标函数一样   建造。提供的此值将被忽略,而前置   参数被提供给模拟函数。