关于如何使用显式绑定方法的困惑

Posted

技术标签:

【中文标题】关于如何使用显式绑定方法的困惑【英文标题】:Confusion over how to use explicit binding methods 【发布时间】:2021-01-29 20:37:22 【问题描述】:

不确定是否有人可以帮助我解决这个问题,但我知道可以使用 bind、apply 和 call 方法使函数中的 this 关键字引用您选择的特定对象。但是,我仍然有点困惑,因为在某些情况下,当我期望一个特定的结果时,我得到了另一个。这是我拥有的对象的示例:

var obj = 
    fullName: "John Doe",
    person: 
        sayHi: function() 
            console.log("This person's name is " + this.fullName)
        
    

我知道调用 obj.person.sayHi() 方法会导致人名未定义,因为隐式对象是人。

我也知道您可以通过使用 bind 调用方法来引用正确的对象,或者像这样调用:

obj.person.sayHi.call(obj)obj.person.sayHi.bind(obj)()

为了显示此人的姓名。但是,我也希望可以将绑定直接附加到对象内部的函数表达式,如下所示:

var obj = 
    fullName: "John Doe",
    person: 
        sayHi: function() 
            console.log("This person's name is " + this.fullName)
        .bind(obj)
    

然后像这样调用函数:obj.person.sayHi(),你会得到相同的结果,但是在这种情况下,this 关键字指的是全局对象。但是,如果我执行以下操作:

let sayHi = function() 
    console.log("This person's name is " + this.fullName)


sayHi.bind(obj)();

然后我得到了想要的结果。谁能解释为什么第二种方法不是有效的?提前致谢。

【问题讨论】:

【参考方案1】:

这是无效的:

var obj = 
    fullName: "Harry Potter",
    person: 
        sayHi: function() 
            console.log("This person's name is " + this.fullName)
        .bind(obj) // obj is not defined here yet, obj is undefined
    

因为obj 在调用bind 时未定义。 obj 确实是在声明结束时定义的,但是在 obj 的声明中有一种循环引用,当调用 bind(obj) 时,它很可能具有 undefined 的值。

另一种明确查看这一点的方法是执行以下操作:

var obj = 
    fullName: "Harry Potter",
    person: 
        sayHi: function() 
            console.log("This person's name is " + this.fullName)
        .bind(obj) // obj is not defined here yet, obj is undefined
    ,
    ref: obj

console.log(obj.ref); // undefined

【讨论】:

【参考方案2】:

嗨@Nikos 感谢您的回复。我想我现在走上了正轨。我只是想知道一件事。如果我执行以下操作:

function dummy(fn) return fn();
var obj = 
    fullName: "Harry Potter",
    person: 
        sayHi: function() 
            dummy(function() 
                console.log("This person's name is " + this.fullName);
                console
            .bind(obj))
        
    

然后调用函数obj.person.sayHi()就会产生想要的效果。这是否以某种方式将函数表达式从对象定义中取出?抱歉,我尝试将此作为评论发布,但我不知道如何将其转换为正确的格式

【讨论】:

使用 dummy 函数会延迟到 obj 的绑定,以便在调用函数时,即在实际的 obj 声明之后。实际上,任何在 obj 被声明后绑定到 obj 的方法(而不是在声明时)都可以工作

以上是关于关于如何使用显式绑定方法的困惑的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GDAL ruby​​ 绑定中显式关闭数据集?

对从命令行(optparse)R传递参数感到困惑,即使使用显式“默认”选项也没有存储参数

关于如何使用模块模式的困惑

关于 vim 折叠的困惑 - 如何禁用?

如何在 Avalonia 中绑定颜色

关于将值传递给方法的困惑? [复制]