假设我有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等概念不熟悉。所以试着从新手的角度来理解。
答案 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}