在以下构造中:
(function(){
var x = function(){
alert('hi!');
}
var y = function(){
alert("hi again!");
}
this.show = function(){
alert("This is show function!");
}
})();
为什么this
引用window
对象? IIFE中的所有内容是否应与全球范围隔离? x
和y
函数是window
全局对象的属性吗?
另外,即使我在开头使用put var h = ...
:
var h = (function(){
var x = function(){
alert('hi!');
}
var y = function(){
alert("hi again!");
}
this.show = function(){
alert("This is show function!");
}
})();
this
仍然引用窗口对象 - 我可以从全局范围调用show()
!怎么样?
答案 0 :(得分:10)
全局上下文(浏览器中为window
)是在没有其他值可供使用时获得的值this
。
您的本地变量是本地变量(即window
的属性)。它们在var
的函数内声明。
添加var h = (function(){...
没有区别的原因是因为你调用函数的方式。函数引用不是对象的属性值(如something.func()
),并且您不使用.call()
或.apply()
调用它,因此这指的是全局({{ 1}})对象。这就是定义语言行为的方式。
答案 1 :(得分:10)
@Pointy是正确的,但他没有提出整个问题 - 你可能对this related answer感兴趣。这里的问题是如果你没有使用new
关键字,那么你没有实例化一个对象,所以没有this
引用的实例。如果没有实例,this
会引用window
对象。
通常,您在IIFE中不需要this
,因为您可以直接访问匿名函数范围中定义的任何函数或变量 - show()
可以调用x()
和直接y()
,因此无需this
引用。可能有一个有效的用例来实例化new
的IIFE,但我从未遇到过它。