4

只是在尝试一个概念证明,.bind()并注意到如果我尝试.bind()在这段代码中使用,我会得到一个意外的令牌“。”:

var myObj = {
    foo: function(){
        function bar(){
            console.log(this);
        }.bind(this); // errors
        bar();
    }
}

myObj.foo();

但是,如果我这样做:

var myObj = {
    foo: function(){
        var bar = function(){
            console.log(this);
        }.bind(this);
        bar();
    }
}

myObj.foo();

没关系。没有错误。有人可以解释一下这种行为吗?我猜这与解析函数的时间有关,但如果有人有更深入的解释,那就太好了!

4

1 回答 1

4

bind()是一种方法Function.prototype。因此,它应该在函数对象上调用,并将返回一个具有相同主体但不同值绑定到的新函数this

当使用函数声明(你的第一个场景)时,你不会得到一个函数对象作为回报(你的第一个场景),因此会出错。没有什么可以呼吁bind()的。

第二个有效,因为你为变量分配了一个函数,所以你得到了一个函数对象。

考虑:

function a() {
   return this.variable;
}

a(); // === undefined, because "this" is bound to the global object, 
     // and global object does not have "variable" defined.
     // When not in strict mode, global object === window (in browser env).

var b = window.a.bind({variable: 'value'});
    // Since a() was declared, it is a property of the global object (window).
    // Lets get it and bind to some object.

b(); // === 'value' - because 'b' is essentialy 'a' bound to {variable: 'value'}.

window.variable = 'other value';  // assign variable to global object
a(); // === 'other value'
b(); // === 'value' - it is not bound to global object, so no change here.

所以在你的例子中你可以这样做:

var myObj = {
    foo: function(){
        function bar(){
            console.log('this', this);
        }

        var bar2 = bar.bind(this);
        bar2();

        // Or:
        // bar.bind(this)();
    }
}
于 2013-10-13T12:28:53.380 回答