对如何使用显式绑定方法感到困惑
Confusion over how to use explicit binding methods
不确定是否有人可以帮助我解决这个问题,但我知道可以使用 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)();
然后我得到了想要的结果。谁能解释为什么第二种方法无效?提前致谢。
这是无效的:
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
的值被调用。
另一种明确查看的方法是执行以下操作:
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
您好@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()
将产生预期的效果。这是否以某种方式将函数表达式从对象定义中取出?抱歉,我尝试将此作为评论发布,但我不知道如何将其设置为正确的格式
不确定是否有人可以帮助我解决这个问题,但我知道可以使用 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)();
然后我得到了想要的结果。谁能解释为什么第二种方法无效?提前致谢。
这是无效的:
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
的值被调用。
另一种明确查看的方法是执行以下操作:
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
您好@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()
将产生预期的效果。这是否以某种方式将函数表达式从对象定义中取出?抱歉,我尝试将此作为评论发布,但我不知道如何将其设置为正确的格式