IIFE背景问题

DrS*_*ove 8 javascript this iife

在以下构造中:

(function(){

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

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

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

})();
Run Code Online (Sandbox Code Playgroud)

为什么要this引用window对象?IIFE中的所有内容是否应与全球范围隔离?是xy函数也是window全局对象的属性?

而且,即使我var h = ...在开头使用put :

var h = (function(){

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

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

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

})();
Run Code Online (Sandbox Code Playgroud)

this仍然指的是窗口对象 - 我可以show()从全局范围调用!怎么会?

Poi*_*nty 10

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

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

添加var h = (function(){...没有区别的原因是因为你调用函数的方式.函数引用不是对象的属性值(如something.func()),也不用.call()or 调用它.apply(),因此它引用了global(window)对象.这就是定义语言行为的方式.


nra*_*itz 10

@Pointy是正确的,但他没有提出整个问题 - 你可能对这个相关的答案感兴趣.这里的问题是,如果你没有使用new关键字,你没有实例化一个对象,所以没有this要引用的实例.在没有实例的情况下,thiswindow对象.

一般情况下,你不需要this一个IIFE内,因为你要的任何功能或在匿名函数的范围定义的变量直接访问- show()可以打电话x()y()直接,所以没有必要为一个this参考.可能有一个有效的用例来实例化IIFE new,但我从未遇到过它.

  • 一个有效的情况是您需要在IIFE中将“ this”传递给另一个使用它进行回调的对象。 (2认同)