This question already has answers here:
Reason behind this self invoking anonymous function variant
(5个答案)
5年前关闭。
我已经看到大量的javascript代码使用自执行功能,例如:
但偶尔,我看到人们会这样做:
这两种形式之间在功能上有区别吗?如果是这样,那是什么?
第2种形式的示例:https://github.com/shawnmclean/Idle.js/blob/master/build/idle.js#L160
(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
值,因此在该特定示例中肯定是多余的。