Javascript将其绑定到对象外部的函数

Javascript将其绑定到对象外部的函数,javascript,object,call,bind,apply,Javascript,Object,Call,Bind,Apply,我读过关于bind被用来访问对象外部的函数内部的这个,但由于某些原因,我无法做到这一点 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 av

我读过关于bind被用来访问对象外部的函数内部的
这个
,但由于某些原因,我无法做到这一点

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的理解有关。

发生这种情况是因为在绑定
时,此
指向
窗口
对象。这有点棘手,但在JS中,仅仅因为
在对象中,它不会自动成为对象。它更像是:
指向窗口,除非应用了某些规则

你可能会问什么规则?来自一个惊人的系列丛书:

确定这一点

现在,我们可以总结从函数中确定这一点的规则 调用的调用站点,按优先级顺序排列。用英语问这些问题 此命令,并在应用第一条规则时停止

是否使用
new
new binding)调用函数?如果是的话,这就是问题所在 新构造的对象

var bar=new foo()

使用
调用
应用
显式绑定)调用的函数是否为偶数 隐藏在绑定硬绑定中?如果是这样的话,这就是问题所在 指定的对象

var bar=foo.call(obj2)

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

var bar=obj1.foo()
-这就是为什么
SETTINGS.x()工作顺便说一句

否则,默认值为this(默认绑定)。如果处于严格模式,则选择 未定义,否则拾取全局对象

var bar=foo()
-您的案例

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


请注意ES6,因为它们会自动绑定
(就像
绑定
)。

在定义
设置时
对象
指向
窗口