This question already has answers here:
Reason behind this self invoking anonymous function variant
                            
                                (5个答案)
                            
                    
                5年前关闭。
        

    

我已经看到大量的javascript代码使用自执行功能,例如:

(function(){
    // ... code here
})();


但偶尔,我看到人们会这样做:

(function(){
    // ... code here
}).call(this);


这两种形式之间在功能上有区别吗?如果是这样,那是什么?

第2种形式的示例:https://github.com/shawnmclean/Idle.js/blob/master/build/idle.js#L160

最佳答案

第二种形式将this的值传递给IIFE,因此IIFE内部的this将具有与IIFE外部相同的值。在许多情况下,这没有什么区别,但是如果IIFE在将this设置为某个有意义值的范围内,则第二种形式将在IIFE内部保留该this值。

如果外部范围中的this是全局对象,并且您没有运行严格模式,则第二种形式并没有真正改变任何内容,因为this仍将是IIFE中的全局对象。

但是,如果this在严格模式下为任何有意义的值,或者在非严格模式下为全局对象以外的任何有意义的值,则第二种形式会将this的值扩展到外壳中。

在您所指向的示例中,我的猜测是第二种形式仅被用作一种常见的设计模式,而不是因为在这种特殊情况下确实有理由这样做。实际上,如果您看一下所指向的代码示例,它甚至不使用IIFE顶层的this值,因此在该特定示例中肯定是多余的。

10-01 07:08
查看更多