为什么我们在揭示模块模式中使用自执行功能?

时间:2012-02-26 23:24:13

标签: javascript jquery revealing-module-pattern

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

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

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

2 个答案:

答案 0 :(得分:8)

  

为什么我们在揭示模块模式中使用自执行功能?

JavaScript具有一流的功能,缺少块范围,因此函数用于引入新的范围。

  

在下面的场景中,可以将函数Init包装在SocialMedia函数()中,即嵌入式函数   ...我们可以将属性值分配给自执行代码块并不奇怪吗?

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

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

  

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

这不是JavaScript独有的。具有first class functions的所有语言都具有此属性,例如:

  • Lisp中,
  • OCaml的,
  • Scala中,
  • 开始,
  • C#(通过代表),
  • C(通过fn ptrs),
  • Python和
  • Perl(通过&),
  • 红宝石,
  • 的Lua

在最近的语言发展中,一流的功能是常态而不是规则。非静态类型语言只是简化了因为类型系统语法没有开销而且没有variance问题。

即便是Java也可能会加入Lambdas slated for Java 8的行列。

在许多其他语言中,立即调用函数并不是那么有用。大多数其他语言都是block-scoped,因此如果您想将变量分开,只需使用{...}块即可。但是在JavaScript中,var的范围限定为包含function或Program的最小值,因此function是引入新范围的最简单方法。

Ruby在块和函数之间做了很少的区分,所以在这方面可以被认为与JS类似。

答案 1 :(得分:1)

自动执行功能用于引入新范围,另请参阅Mike Samuels的回答。

有两个原因:

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

当然你可以堆叠范围,但通常你不会创建那些你必须避免污染本地模块范围的大模块: - )

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

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

        }
    }
}
相关问题