为什么我们需要IIFE在Javascript中使用模块作用域?

时间:2014-08-28 21:27:43

标签: javascript iife modular-design

假设我有core.js

var ajax = function(){};
var something = function(){super};
var globalconstant = 5;
var someutilitymodule = {
onekey: something;
twokey: something;
}

如果我将此作为<script src="core.js">

添加到我的文件中

1)我污染全局命名空间

2)可能[替换/替换为]另一个变量。

然而,不能让它成为一个对象解决问题?即我像这样制作core.js

core = 
{
    ajax : function(){},
    something : function(){super},
    globalconstant : 5,
    someutilitymodule = {
                        onekey: something;
                        twokey: something;
                        }
}

这种方法的根本问题是什么?是因为在创建完整的Object之前,您无法访问其他项目?例如,core = {a:"Foo" , b:a}无法工作? 但是我可以通过

来解决它
core = {};
core.a="Foo";
core.b=core.a;

如果我们对闭包不感兴趣,为什么我们必须进入IIFE(立即调用函数表达式)?对于&#34;模块命名空间&#34;在Javascript中,并不介意在不同的命名空间中公开所有内容,这种方法是否有效并在Javascript中创建模块效果?

是否有任何指示可以阅读更多内容?我知道它有点模糊,但我对IIFE requirejs等概念不熟悉。所以试着从新手的角度来理解。

1 个答案:

答案 0 :(得分:0)

此问题与JavaScript - Advantages of object literal有关。

“对象文字符号”是对此的技术术语。它是用于在JavaScript中隔离代码的常用模式之一,尽管像http://css-tricks.com/how-do-you-structure-javascript-the-module-pattern-edition/这样的模块模式是更高级的形式,它使用IFFE只是为了获得使用闭包的私有变量等额外功能。

但是,除非您立即在函数中定义方法,否则以后无法访问IFFE变量。您不能在以后扩展方法以使用此IIFE变量。

例如:

//counter here is the iife functions' counter variable
var module = (function(){var counter=1; return {getCounter: function(){return counter}}})()

//counter here is the global counter variable as it was created from the global scope
module.setCounter = function(arg){counter = arg + counter}