我已经看到大量的javascript代码使用自执行功能,如:
(function(){
// ... code here
})();
但偶尔也会看到人们做这种变体:
(function(){
// ... code here
}).call(this);
这两种形式之间是否存在某些功能差异?如果是这样,它是什么?
野外第二种形式的例子:https://github.com/shawnmclean/Idle.js/blob/master/build/idle.js#L160
答案 0 :(得分:2)
第二种形式将this
的值传递给IIFE,因此IIFE内的this
将具有与IIFE之外相同的值。在许多情况下,这没有什么区别,但如果IIFE位于this
设置为某个有意义值的范围内,则第二个表单将在IIFE中保留this
的值
如果外部作用域中的this
是全局对象并且您没有运行严格模式,那么第二种形式并没有真正改变任何内容,因为this
仍然是内部的全局对象IIFE。
但是,如果this
在严格模式下是任何有意义的值,或者在非严格模式下是全局对象以外的任何有意义的值,那么第二个表单会将this
的值扩展到机箱中
在你指出的例子中,我的猜测是第二种形式只是被用作一种常见的设计模式,而不是因为在这种特殊情况下确实存在这样的原因。事实上,如果你看一下你所指出的代码示例,它甚至不会在IIFE的顶层使用this
的值,所以它在这个具体的例子中肯定是多余的。