在以下构造中:
(function(){
var x = function(){
alert('hi!');
}
var y = function(){
alert("hi again!");
}
this.show = function(){
alert("This is show function!");
}
})();
为什么this
引用window
对象?生活中的一切都应该与全球范围隔绝吗?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()
!怎么会这样?
发布于 2011-10-05 04:42:03
全局上下文(浏览器中的window
)是this
在没有其他值可用时获得的值。
您的局部变量是局部变量(即,不是window
的属性)。它们是在函数中用var
声明的。
添加var h = (function(){...
没有区别的原因是调用函数的方式不同。函数引用不是对象(如something.func()
)的属性值,并且您不能使用.call()
或.apply()
调用它,因此这引用了全局(window
)对象。这正是语言被定义为行为的方式。
发布于 2011-10-05 05:02:00
@Pointy是正确的,但他并没有呈现整个问题-你可能会对this related answer感兴趣。这里的问题是,如果不使用new
关键字,就不会实例化对象,因此this
就没有实例可供引用。如果没有实例,this
将引用window
对象。
通常,在there中不需要this
,因为您可以直接访问匿名函数作用域中定义的任何函数或变量- show()
可以直接调用x()
和y()
,因此不需要this
引用。使用new
实例化IIFE可能有一个有效的用例,但我从未遇到过它。
https://stackoverflow.com/questions/7653757
复制相似问题