我多年来一直在积极使用揭示模块模式,但我想更深入地了解一些事情。据我所知,自我执行功能的潜在好处是无形的。自我执行,这两者在这种特定模式中似乎没有必要/利用。我不明白的另一件事是,在下面的场景中可以将函数Init包装在SocialMedia函数()中,即嵌入函数,自执行函数似乎是JS中一个非常独特的构造,isn我们可以将属性值分配给自动执行的代码块,这很奇怪吗?
var myObj = {
prop1, "prop1value",
SocialMedia: (function () {
function Init() {
}
return {
Init: Init
}
})()
}
答案 0 :(得分:8)
为什么我们在揭示模块模式中使用自执行功能?
JavaScript具有一流的功能,缺少块范围,因此函数用于引入新的范围。
在下面的场景中,可以将函数Init包装在SocialMedia函数()中,即嵌入式函数 ...我们可以将属性值分配给自执行代码块并不奇怪吗?
在JavaScript中,函数只是响应()
和new
运算符的对象。
与其他对象一样,您可以在定义它时使用它,或将其存储在变量或属性中供以后使用。
自执行函数似乎是JS中一个非常独特的构造
这不是JavaScript独有的。具有first class functions的所有语言都具有此属性,例如:
&
),在最近的语言发展中,一流的功能是常态而不是规则。非静态类型语言只是简化了因为类型系统语法没有开销而且没有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() {
}
}
}