为什么原型函数的执行上下文(“this”)在这个例子中是错误的?

时间:2013-02-18 22:08:34

标签: javascript node.js this anonymous-function

原型函数bar在Node.js环境(其中bind应该可用)的其他地方执行。我希望this函数中的 bar()成为我的对象的实例

var Foo = function (arg) {
    this.arg = arg;

    Foo.prototype.bar.bind(this);
};

Foo.prototype.bar = function () {
    console.log(this); // Not my object!
    console.log(this.arg); // ... thus this is undefined
}

var foo = new Foo();
module.execute('action', foo.bar); // foo.bar is the callback 

...为什么bar()日志undefinedthis不是我的实例?为什么执行上下文没有被bind调用改变?

1 个答案:

答案 0 :(得分:6)

Function.bind返回一个值 - 新绑定的函数 - 但您只是丢弃该值。 Function.bind不会改变this(即它的调用上下文),也不会改变它的参数(this)。

  

还有其他方法可以获得相同的结果吗?

在构造函数内部执行它实际上是错误的,因为bar位于Foo.prototype上,因此将其绑定到Foo的任何一个实例会导致所有this中断其他Foo.bar来电!将它绑定在意为的地方:

module.execute('action', foo.bar.bind(foo));

或者 - 甚至可能更简单 - 根本不在原型上定义bar

var Foo = function (arg) {
    this.arg = arg;

    function bar () {
        console.log(this);
        console.log(this.arg);
    }

    this.bar = bar.bind(this);
};

var foo = new Foo();
module.execute('action', foo.bar);