当我运行以下代码时,为什么IFFE 此引用窗口对象而不是 a
var a = {
printThis : function () {
console.log('printThis', this);
var inner = (function () {
console.log('inner', this);
})();
}
};
a.printThis();
//输出
printThis 一个对象
内部窗口对象< - 为什么......?
答案 0 :(得分:8)
考虑以下示例:
var a = {};
var b = {};
a.hello = function() { console.log(this); };
b.hello = a.hello;
在大多数编程语言中,b.hello()
会打印a
,因为它们基于函数所在的this
。该函数位于a
,因此this
为a
。有道理,对吧?
然而,JavaScript在这方面有点不同。而不是它在哪里,它基于如何被称为。 b.hello()
在hello
上调用了b
,因此this
设置为b
。这也是有道理的,因为JavaScript并没有真正具有“where”函数的概念(不像Java中的方法,它总是与特定的类绑定),并且很难确定a
是“是”的地方。
因此,foo.bar()
将始终将this
设置为foo
,以便调用bar
(除非有人使用bind
或类似绑定提前this
到特定值。
现在,一个IIFE被调用......没什么,真的。这不是foo.bar()
情况,它只是bar()
,其中bar
是您的函数表达式。在没有foo
的情况下,默认为window
对象。
有两种简单的解决方法:
var that = this;
并在IIFE中使用that
代替this
,或bind
this
值:(function(){ CODE GOES HERE }).bind(this)();