为什么'this'在这种情况下不起作用

Why does 'this' not work in this instance?

本文关键字:不起作用 这种情况下 this 为什么      更新时间:2023-09-26

这样不行:

var myObj = {
  name : 'luke',
  age : '24',
  myFunc: (function() {
    console.log(this.name); //returns nothing 
  }())
};

如果我使用这个:

var myObj = {
  name : 'luke',
  age : '24',
  myFunc: (function() {
    console.log(myObj.name); //it works
  }())
};

第5行第一个例子中的'this'失败的原因是什么?

this的值是由Javascript解释器根据函数的调用方式设置的,而不是函数的声明方式。

在这种情况下,您将调用函数作为一个正常的函数,因此this将被设置为全局对象(在浏览器中是window)或undefined(在严格模式下)。

声明的这一部分:

(function() {
    console.log(this.name); //returns nothing 
}())

只是一个正常的IIFE函数调用,因此this被设置为windowundefined(如果在严格模式下)。

关于this可以由调用代码控制的五种不同方式的完整描述,请参阅此回答。

此外,你的myFunc属性结束undefined,因为你有一个IIFE作为值,但是IIFE不返回任何东西,所以返回值是undefined,因此myFunc属性的结果值是undefined


既然你似乎很难理解你的IIFE是如何工作的,你的代码在这里:

var myObj = {
  name : 'luke',
  age : '24',
  myFunc: (function() {
    console.log(this.name); //returns nothing 
  }())
};

的计算结果与以下相同:

function aFunc() {
    console.log(this.name);
}
var myObj = {
  name : 'luke',
  age : '24',
  myFunc: aFunc()
};

并且,从这里,您应该能够看到aFunc()是一个正常的函数调用,导致Javascript将该函数中的this设置为windowundefined(如果在严格模式下)。

因为在下面的代码声明中

myFunc: (function() {
    console.log(this.name); //returns nothing 
}())

this将指向window对象。

如果你用删除。name

来替换上面的代码块
myFunc: (function() {
    console.log(this); //Outputs window object on the console.
}())

无论哪种方式,它们都是自执行的函数,它们不返回任何值,唯一的事情是在定义对象时,您可以看到它们的控制台输出。如果执行第一个,可以在控制台输出的第二个window对象中看到window.name