【问题标题】:Javascript bind this to a function outside objectJavascript将此绑定到对象外部的函数
【发布时间】:2016-08-30 09:14:31
【问题描述】:

我已经阅读了有关在对象外部的函数内部使用绑定来访问 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的理解有关。

【问题讨论】:

  • 在定义SETTINGS对象时this指向window

标签: javascript object call bind apply


【解决方案1】:

发生这种情况是因为在您绑定 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(); 起作用的原因。

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

var bar = foo() - 你的情况

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-05
    • 2013-04-02
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多