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

Javascript 关于如何使用显式绑定方法的困惑,javascript,object,binding,this,Javascript,Object,Binding,This,不确定是否有人可以帮助我解决这个问题,但我知道可以使用bind、apply和call方法使函数中的this关键字引用您选择的特定对象。然而,我仍然有点困惑,因为在某些情况下,当我期望一个特定的结果时,我得到了另一个。以下是我拥有的一个对象的示例: var obj = { fullName: "John Doe", person: { sayHi: function() { console.log("This p

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

var obj = {
    fullName: "John Doe",
    person: {
        sayHi: function() {
            console.log("This person's name is " + this.fullName)
        }
    }
}
我知道调用obj.person.sayHi()方法会导致人名未定义,因为隐式对象是person

我还知道,您可以通过使用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)();
然后我得到了想要的结果。有人能解释为什么第二种方法是无效的吗?提前感谢。

这是无效的:

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
    }
}
因为调用
bind
时,
obj
未定义
obj
确实是在声明结束时定义的,但是在
obj
声明中有一种循环引用,当调用
bind(obj)
时,该循环引用的值很可能是
undefined

另一种明确的方式是执行以下操作:

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

sayHi.bind(obj)();
var obj={
全名:“哈利波特”,
人:{
sayHi:function(){
log(“此人的名字是”+This.fullName)
}.bind(obj)//此处尚未定义obj,obj未定义
},
参考:obj
}
控制台日志(对象参考);//未定义
这是无效的:

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
    }
}
因为调用
bind
时,
obj
未定义
obj
确实是在声明结束时定义的,但是在
obj
声明中有一种循环引用,当调用
bind(obj)
时,该循环引用的值很可能是
undefined

另一种明确的方式是执行以下操作:

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

sayHi.bind(obj)();
var obj={
全名:“哈利波特”,
人:{
sayHi:function(){
log(“此人的名字是”+This.fullName)
}.bind(obj)//此处尚未定义obj,obj未定义
},
参考:obj
}

控制台日志(对象参考);//未定义
Hi@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()
将产生所需的效果。这是不是从对象定义中去掉了函数表达式?抱歉,我试图将此作为评论发布,但是,我不知道如何将其转换为正确的格式

Hi@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
的任何方法都将工作。使用
函数延迟绑定到
obj
函数,以便在调用函数时,即在实际的
obj
声明之后。实际上,在声明了
obj
之后(而不是在声明时),任何绑定到
obj
的方法都可以工作