IIFE背景问题

时间:2011-10-04 20:39:34

标签: javascript this iife

在以下构造中:

(function(){

    var x = function(){
        alert('hi!');
    }

    var y = function(){
        alert("hi again!");
    }

    this.show = function(){
        alert("This is show function!");
    }

})();

为什么this引用window对象? IIFE中的所有内容是否应与全球范围隔离? xy函数是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()!怎么样?

2 个答案:

答案 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,但我从未遇到过它。