我已经看到了编写自我调用函数的下一种方法:
(function (app) {
app.foo = {
bar: function(){}
};
}(App));
App
是全局对象。
我想知道,为什么我们需要将App
作为参数传递给函数?为什么不直接使用它:
(function () {
App.foo = {
bar: function(){}
};
}());
我看到使用第一种方式只有一个优势。如果我们由于某种原因重命名App
对象,那么我们可以轻松地在括号中重命名参数,我们的代码将在其工作时起作用。但是在第二种方式的情况下,我们可能需要在我们使用它的所有地方重命名App
。
还有其他差异吗?
答案 0 :(得分:9)
这意味着函数的内容 - 关于app
标识符 - 对全局(或父)范围是不可知的。
其中一个场景是,例如,使用jQuery,当你不想假设jQuery对象被调用$
时(例如,如果启用了无冲突模式),但你做想要用这个名字来呼叫它。通过这样的匿名函数(即(function($) {})(jQuery)
)传递它可以生成本地范围的别名,该别名不会干扰父/全局范围中名称$
的外部含义。 / p>
答案 1 :(得分:2)
其他答案解释了拥有本地范围副本的好处。还有一些其他好处:
App
。答案 2 :(得分:1)
例如,许多库使用“$”字符作为其主要功能(例如JQuery)的快捷方式。这很方便,但在使用多个库时可能会导致冲突。所以,你可以像这样传递JQuery
:
(function($) {
// Code
var nav = $('#nav');
// More code
})(JQuery);
这样,您仍然可以使用方便的快捷方式,但也可以避免冲突(只要您还配置库不使用“$”快捷方式)。
答案 3 :(得分:1)
您还可以使用它在本地重新定义全局变量,以确保它们包含您期望的全部变量:
(function($, undefined) { ... })(jQuery);
undefined
现在是预期的未定义。另请参阅:What is the purpose of passing-in undefined?
其他答案中都涵盖了大多数其他用途。