gpt4 book ai didi

javascript - 一个方法可以在没有 bind() 的情况下在回调中引用它的对象吗?

转载 作者:行者123 更新时间:2023-11-30 13:23:45 26 4
gpt4 key购买 nike

我正在制作一个测试用例来展示“绑定(bind)”对于方法在回调中引用其函数的必要性。

但就在我认为我了解 JS 的时候 - 下面的代码工作正常 - 不需要绑定(bind)!

pretendThingConstructor = function (greeting) {
this.greeting = greeting;
this.sayHello = function() {
console.log(this.greeting);
};
}

var pretend_thing = new pretendThingConstructor('hello world');

pretend_thing.sayHello();

setTimeout(function() {
pretend_thing.sayHello()
}, 3000);

当我运行它时——通过节点、phantomjs 或其他 JS 环境——它可以工作。 'hello world' 打印了两次。

我预计第二个“hello world”——在超时后运行的那个——会失败,因为“this”指的是事件,而不是对象。但它有效。这是为什么?

最佳答案

this 会根据您调用 函数的方式而变化。如果您指定一个基础对象,它将引用那个:

pretend_thing.sayHello()

这里 pretend_thing 是那个基础对象,因此 this 仍然指那个对象。另一方面,如果您有:

var f = pretend_thing.sayHello;
f();

此处 this 应该引用 window 对象。

您可以通过以下方式确认:

console.log (this instanceof pretendThingConstructor);

在您的 sayHello 函数中。在这两种情况下,它都会打印 true


pretendThingConstructor = function (greeting) {
this.greeting = greeting;
this.sayHello = function() {
console.log(this.greeting);
console.log(this instanceof pretendThingConstructor);
};
}

var pretend_thing = new pretendThingConstructor('hello world');
////////////////////////////

pretend_thing.sayHello();

setTimeout(function() {
pretend_thing.sayHello();
}, 3000);

将输出:

true
true

鉴于:

var f = pretend_thing.sayHello;
f();

输出:

false

关于javascript - 一个方法可以在没有 bind() 的情况下在回调中引用它的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9291799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com