使用call方法显式调用自执行函数

时间:2014-12-08 00:36:35

标签: javascript

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

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

但偶尔也会看到人们做这种变体:

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

这两种形式之间是否存在某些功能差异?如果是这样,它是什么?

野外第二种形式的例子:https://github.com/shawnmclean/Idle.js/blob/master/build/idle.js#L160

1 个答案:

答案 0 :(得分:2)

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

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

但是,如果this在严格模式下是任何有意义的值,或者在非严格模式下是全局对象以外的任何有意义的值,那么第二个表单会将this的值扩展到机箱中

在你指出的例子中,我的猜测是第二种形式只是被用作一种常见的设计模式,而不是因为在这种特殊情况下确实存在这样的原因。事实上,如果你看一下你所指出的代码示例,它甚至不会在IIFE的顶层使用this的值,所以它在这个具体的例子中肯定是多余的。