为什么我们需要生活;在Javascript中有模块作用域吗?

为什么我们需要生活;在Javascript中有模块作用域吗?,javascript,iife,modular-design,Javascript,Iife,Modular Design,假设我有core.js var ajax = function(){}; var something = function(){super}; var globalconstant = 5; var someutilitymodule = { onekey: something; twokey: something; } 如果我将其作为 1) 我污染了全局名称空间 2) 可能[替换/被]另一个变量替换 然而,让它成为一个对象难道不能解决问题吗?我把core.js做成这样 core = {

假设我有core.js

var ajax = function(){};
var something = function(){super};
var globalconstant = 5;
var someutilitymodule = {
onekey: something;
twokey: something;
}
如果我将其作为

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中创建模块效果


关于这一点,有没有更多的建议?我知道这有点模糊,但我对生活要求等概念还不熟悉。所以,试着从新手的角度去理解。

这个问题与

“对象文字符号”是这方面的技术术语。它是JavaScript中分离代码的常用模式之一,尽管模块模式like是更高级的形式,它使用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}

IIFE允许您拥有无法从外部访问的本地数据。
core={a:“Foo”,b:a}
不起作用,因为
core.b
不假定当前根目录是
core
core={a:“Foo”,b:core.a}
将起作用,因此有关访问其他项的参数无效。解释说生活很好哈,我被@PHPglue的评论震惊了。那肯定行不通。因为您处于全局上下文(
window
this.something
指的是
window.something
,所以在本例中,您需要
this.core.a
,它与
core.a
基本相同。你应该只在函数作用域中使用
这个
。这不是我的意思。必须是
core.someutilitymodule
@Tyblitz:
core={a:“Foo”,b:core.a}
不起作用,因为
core
在尝试访问它时还没有值(
b:core.a
)。