如何解决关于如何使用显式绑定方法的困惑
不确定是否有人可以帮助我解决此问题,但是我知道可以使用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或call调用方法来引用正确的对象,如下所示:
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
}
}
因为调用obj
时bind
未定义。 obj
的确在声明结束时定义,但是您在obj
声明中有一种循环引用,当undefined
时最有可能具有bind(obj)
的值被称为。
另一种明确看到此情况的方法是执行以下操作:
var obj = {
fullName: "Harry Potter",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()
将产生所需的效果。这是否会使函数表达式脱离对象定义?抱歉,我尝试将其发布为评论,但是,我不知道如何将其设置为正确的格式
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。