在以下构造中:
(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
复制相似问题