这种方式不起作用:
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行的第一个例子中失败了吗?
答案 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
设置为window
或undefined
(如果处于严格模式)。
有关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} (如果是严格模式)。