自我调用功能和参数?

时间:2013-01-18 13:43:03

标签: javascript function identifier

我已经看到了编写自我调用函数的下一种方法:

(function (app) {
    app.foo = {
        bar: function(){}
    };
}(App));

App是全局对象。

我想知道,为什么我们需要将App作为参数传递给函数?为什么不直接使用它:

(function () {
    App.foo = {
        bar: function(){}
    };
}());

我看到使用第一种方式只有一个优势。如果我们由于某种原因重命名App对象,那么我们可以轻松地在括号中重命名参数,我们的代码将在其工作时起作用。但是在第二种方式的情况下,我们可能需要在我们使用它的所有地方重命名App

还有其他差异吗?

4 个答案:

答案 0 :(得分:9)

这意味着函数的内容 - 关于app标识符 - 对全局(或父)范围是不可知的。

其中一个场景是,例如,使用jQuery,当你不想假设jQuery对象被调用$时(例如,如果启用了无冲突模式),但你想要用这个名字来呼叫它。通过这样的匿名函数(即(function($) {})(jQuery))传递它可以生成本地范围的别名,该别名不会干扰父/全局范围中名称$的外部含义。 / p>

答案 1 :(得分:2)

其他答案解释了拥有本地范围副本的好处。还有一些其他好处:

  • 作为微优化,它减少了范围查找(找到本地var而不是全局var的成本更低)。
  • 它可以帮助缩小过程,因为所有参数都缩减为单个字母名为vars。
  • 它为您提供了一种伪依赖关系管理技术......在您的示例中,您知道您的代码依赖于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?

其他答案中都涵盖了大多数其他用途。