0

假设我有 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;
                        }
}

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

core = {};
core.a="Foo";
core.b=core.a;

如果我们对闭包不感兴趣,为什么还要进入 IIFE(立即调用函数表达式)?对于 Javascript 中的“模块命名空间”,不介意在不同的命名空间中公开所有内容,这种方法不会工作并在 Javascript 中创建模块效果吗?

是否有任何指针可以阅读更多内容?我知道它有点含糊,但我对 IIFE requirejs 等这个概念很陌生。所以试着从新手的角度去理解。

4

1 回答 1

0

这个问题与JavaScript - 对象文字的优点有关

“Object Literal Notation”是对此的技术术语。它是 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}
于 2014-08-29T10:18:13.660 回答