繁体   English   中英

为什么我们需要IIFE在Javascript中进行模块作用域定义?

[英]Why do we need IIFE's to have module scoping in Javascript?

假设我有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等这个概念是新手。 因此,尝试从新手的角度进行理解。

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

“对象文字表示法”是对此的技术术语。 尽管http://css-tricks.com/how-do-you-structure-javascript-the-module-pattern-edition/等模块模式是更高级的形式,但它是在JavaScript中分离代码的常用模式之一。它使用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}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM