3

多年来,我一直在积极使用揭示模块模式,但有一些事情我想更深入地了解。据我了解,自动执行功能的潜在好处是匿名性和自动执行,在这种特定模式中,这两者似乎都没有必要/未使用。我不明白的另一件事是,在下面的场景中,可以将函数 Init 包装在 SocialMedia 函数()中,即嵌入式函数,自执行函数似乎是 JS 中非常独特的构造,是我们可以将属性值分配给自执行代码块,这不奇怪吗?

var myObj = {
    prop1, "prop1value",
    SocialMedia: (function () {
        function Init() {

        }
        return  {
            Init: Init
        }
    })()
}
4

2 回答 2

8

为什么我们在显示模块模式中使用自执行函数?

JavaScript 具有一流的函数并且缺少块作用域,因此函数用于引入新的作用域。

在下面的场景中,什么使得将函数 Init 包装在 SocialMedia 函数()中成为可能,即嵌入式函数......我们可以将属性值分配给自执行代码块,这不是很奇怪吗?

在 JavaScript 中,函数只是一个响应()andnew运算符的对象。

像其他对象一样,您可以在定义它时使用它,或者将其存储在变量或属性中以备后用。

自执行函数似乎是 JS 中一个非常独特的构造

这不是 JavaScript 独有的。所有具有一流功能的语言都具有此属性,例如:

  • 口齿不清,
  • OCaml,
  • 斯卡拉,
  • 去,
  • C#(通过委托),
  • C(通过 fn ptrs),
  • Python,
  • Perl(通过&),
  • 红宝石,
  • 卢阿

在最近的语言发展中,一流的功能是规范而不是规则。非静态类型语言只是让它变得更容易,因为类型系统语法没有开销,也没有差异问题。

甚至 Java 也可能会加入Java 8 的 Lambda的潮流。

在许多其他语言中,立即调用的函数并没有那么有用。大多数其他语言都是块范围的,所以如果你想保持你的变量分开,你只需使用一个{...}块。但是在 JavaScript 中,var它的作用域是最小的包含function或 Program,所以functions 是引入新作用域的最简单方法。

Ruby在块和函数之间几乎没有区别,因此在这方面可以被认为与 JS 相似。

于 2012-02-26T23:29:44.730 回答
1

自执行函数用于引入新的作用域,另见 Mike Samuels 的回答。

有两个原因:

  • 避免污染全局范围
  • 使用闭包,即从额外的范围“导出”一个函数

当然,您可以堆叠作用域,但通常您不会创建必须避免污染本地模块作用域的大模块 :-)

此外,您示例中的自动执行功能是无用的,因为它完全等同于

var myObj = {
    prop1: "prop1value",
    SocialMedia: {
        Init: function Init() {

        }
    }
}
于 2012-02-26T23:55:44.777 回答