此代码块如何在 JavaScript 中工作

How this code blocks work in JavaScript?

本文关键字:JavaScript 工作 代码      更新时间:2023-09-26

让我们看看例子:

第一:

var user = {
  firstName: "John",
  sayHi: function() {
  alert( this.firstName );
  }
};
setTimeout(function() {
  user.sayHi(); // John
}, 1000);

第二:

var user = {
  firstName: "John",
  sayHi: function() {
  alert( this.firstName );
  }
};
setTimeout(user.sayHi, 1000);// undefined

为什么在第二个示例中未定义?这是如何工作的?

当你将函数引用传递给setTimeout函数时,传递的函数引用将在window的作用域中执行。因此,window.firstName将被undefined,因为您在这样的对象中没有任何属性window

var user = {
  firstName: "John",
  sayHi: function() {
  alert( this.firstName );
  }
};
setTimeout(user.sayHi.bind(user), 1000);

因此,正如您在上面的代码中看到的那样,您必须将范围显式绑定到函数引用。您也可以使用传统方式,即使用如下所示的匿名函数,

setTimeout(function(){ user.sayHi(); }, 1000);