我已经读过有关用于访问对象外部函数内部的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的理解有关。
答案 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
一样)。