Javascript将此绑定到对象

时间:2016-08-30 09:14:32

标签: javascript object call bind apply

我已经读过有关用于访问对象外部函数内部的this的绑定但由于某些原因我无法做到这一点。

function test (len){
    return this.length - len;
}
var SETTINGS = {
     length : 21,
     trimmed: test.bind(this,5),
     x: function(){
        return this.length;
     }
};
SETTINGS.x(); // this is available.
SETTINGS.trimmed(); //len is 5 but this is Window.

可能与我对bind的理解有关。

1 个答案:

答案 0 :(得分:2)

这是因为当你绑定this时,它指向window个对象。这有点棘手,但在JS中只是因为this在一个对象中,它不会自动成为对象。它更像是:this 指向窗口,除非应用了某些规则

你可能会问什么规则?从一本惊人的书系列You Don't Know JS

  

确定此

     

现在,我们可以总结一下从函数中确定这个的规则   呼叫的呼叫站点,按其优先顺序排列。问这些问题   此订单,并在第一条规则适用时停止。

     

是否使用new新约束)调用了该函数?如果是这样,那就是   新建的物体。

     

var bar = new foo()

     

是使用call还是apply显式绑定)调用的函数,甚至   隐藏在绑定硬绑定内?如果是这样,这是明确的   指定的对象。

     

var bar = foo.call( obj2 )

     

是否使用上下文(隐式绑定)调用函数,否则   被称为拥有或包含对象?如果是这样,那就是上下文   对象

     

var bar = obj1.foo() - 这就是为什么SETTINGS.x();适用于btw。

     

否则,默认为此(默认绑定)。如果在严格模式下,请选择   未定义,否则选择全局对象。

     

var bar = foo() - 您的案例

在您的情况下,默认规则适用。

请注意ES6 arrow functions,因为它们会自动绑定this(就像bind一样)。