【问题标题】:JavaScript notation: (function() { ... } )(); [duplicate]JavaScript 表示法: (function() { ... } )(); [复制]
【发布时间】:2011-07-12 13:10:04
【问题描述】:

可能重复:
What is the purpose of wrapping whole Javascript files in anonymous functions like “(function(){ … })()”?

大家好,

我见过几个使用这种表示法的 JavaScript 文件:

JavaScript 文件的开始:

(function() {
 // All functions go here. 
 // Can someone say what the wrapping nameless function is used for?
})();

还有原型库,这似乎是可能的:

function $() {
 // Prototype $-wrapping function.
}

有人能解释一下上面的两个代码片段,它们的用途和区别吗?一些可以帮助我找到更多关于这个符号/技术(它是如何命名的)的关键字也会很有帮助,所以我可以在它上面运行谷歌搜索......:)

谢谢!

【问题讨论】:

  • 绝对是上面的副本,我相信比下面任何一个都更好的解释。
  • 那个也包含有趣的信息,谢谢 Gumbo。我也会在其他线程中阅读答案!我在发布此之前进行了搜索,但不确定使用什么作为关键字来查找类似问题。 :)
  • 你可能会觉得10 Things I Learned from the jQuery Source很有趣
  • @Sander:如果这个问题仍然相关,请告诉我,如果不再相关,我可以将其作为副本关闭。

标签: javascript prototypejs


【解决方案1】:

在您的第一个示例中,出于范围界定的原因,人们将他们的代码包围在一个匿名函数中,以避免全局命名空间混乱。这种奇怪的括号语法用于一步定义和执行函数;末尾的() 具有执行函数本身的含义。

因此,您可以在该匿名函数中定义function apple(){},并且只能在该匿名函数中访问它。如果您正在创建一个库并且只希望某些东西使您的全局命名空间混乱,那么这很好。

您的第二个示例只是一个名为$ 的简单函数。许多库喜欢使用此名称,因为它简短明了,而且每次要引用库命名空间时都需要键入它,所以越短越好。

【讨论】:

    【解决方案2】:

    我搜索了“javascript wrapping function”,第一个命中是this,上面写着:

    This method doesn't add any new symbols to the global or LIB spaces.
    

    我不明白问题的第二部分:function $() { ... } 不是“无名”函数:它的名称为 $!如果你喜欢名为 $ 的函数,这是我所知道的最直接的方法。

    【讨论】:

    • 忽略了它确实不是一个无名的函数,我的错 :) 在我的问题中编辑。
    【解决方案3】:

    定义了一个匿名函数

    function() {
    }
    

    然后立即调用

    ()
    

    附加的 () 包围函数是强制解释器将函数视为表达式。 Javascript 将任何以 function 关键字开头的语句视为声明,因此无法立即调用它。

    目的是避免污染全局命名空间。函数中定义的所有变量都是函数的局部变量。

    Google 模块模式。

    【讨论】:

      【解决方案4】:
      【解决方案5】:

      第一个称为立即函数。你可以阅读更多关于这个函数模式here

      【讨论】:

        猜你喜欢
        • 2013-10-19
        • 2011-11-27
        • 2014-03-01
        • 2013-06-01
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        相关资源
        最近更新 更多