【问题标题】:IIFE context issuesIIFE 上下文问题
【发布时间】:2011-12-01 00:16:09
【问题描述】:

在以下构造中:

(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()!怎么会?

【问题讨论】:

    标签: javascript this iife


    【解决方案1】:

    全局上下文(浏览器中的window)是在没有其他值可使用时this 获得的值。

    您的局部变量是局部变量(即不是window 的属性)。它们在函数内部声明为var

    之所以添加var h = (function(){... 没有区别,是因为你调用函数的方式。函数引用不是对象的属性值(如something.func()),并且您不会使用.call().apply() 调用它,因此它指的是全局(window)对象。这就是语言被定义为起作用的方式。

    【讨论】:

      【解决方案2】:

      @Pointy 是正确的,但他并没有提出整个问题 - 你可能对this related answer 感兴趣。这里的问题是,如果你没有使用 new 关键字,你就没有实例化一个对象,所以 this 没有实例可以引用。在没有实例的情况下,this 指的是window 对象。

      一般来说,您不需要在 IIFE 中使用 this,因为您可以直接访问匿名函数范围内定义的任何函数或变量 - show() 可以直接调用 x()y(),所以不需要this 参考。使用new 实例化 IIFE 可能有一个有效的用例,但我从未遇到过。

      【讨论】:

      • 一个有效的情况是当您需要将 IIFE 中的“this”传递给另一个使用它进行回调的对象时。
      • @AndroidDev,您可以使用本地对象并将其视为“this”,当它应该访问您的“this”时将其传递给另一个对象,因为它是使用 bind() 方法的“this”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      相关资源
      最近更新 更多