为什么'这个'在这种情况下无法工作?

时间:2015-10-03 20:43:59

标签: javascript

这种方式不起作用:

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行的第一个例子中失败了吗?

2 个答案:

答案 0 :(得分:1)

因为在下面的代码声明中

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

this将指向window对象。

如果通过删除.name

替换上述块
myFunc: (function() {
    console.log(this); //Outputs window object on the console.
}())

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

答案 1 :(得分:0)

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

在这种情况下,您将该函数调用为普通函数,因此this将设置为全局对象(浏览器中为window)或undefined (严格模式)。

宣言的这一部分:

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

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

有关this可以通过调用代码控制的五种不同方式的完整说明,请参阅this answer

此外,您的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设置为window或{{1} (如果是严格模式)。