【问题标题】:Why do we use self-executing functions in the revealing module pattern?为什么我们在显示模块模式中使用自执行函数?
【发布时间】:2012-02-26 23:24:13
【问题描述】:

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

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

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

【问题讨论】:

  • “我们可以将属性值分配给自执行代码块,这并不奇怪” - 我不认为这很奇怪:您可以分配一个any 表达式的属性,那么为什么不给函数调用的结果呢? (即使是不返回值的函数调用也会起作用,因为它实际上返回的是未定义的。)

标签: javascript jquery revealing-module-pattern


【解决方案1】:

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

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

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

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

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

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

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

  • Lisp,
  • OCaml,
  • 斯卡拉,
  • 去,
  • C#(通过委托),
  • C(通过 fn ptrs),
  • Python,
  • Perl(通过&),
  • 鲁比,
  • 卢阿

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

甚至 Java 也可能与 Lambdas slated for Java 8 一起赶上潮流。

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

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

【讨论】:

    【解决方案2】:

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

    有两个原因:

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

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

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

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

    【讨论】:

    • 是的,我通常会在里面放更多的方法,所以Init,CreateButtons()等,然后我引用myObj.SocialMedia.Init(),
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2020-06-20
    • 2018-06-05
    相关资源
    最近更新 更多