0

function module(){

var a = 1;
var b = 1;
function add(){
    console.log(a+b)
}
function dec(){
    console.log(a-b)
}
return {add:add,dec:dec}

}
var mod = module();
mod.add();
mod.dec();
立即执行函数可以让变量私有化,避免变量污染。那么就上面的代码而言,存在变量污染这个问题吗,试了半天也感觉不出来啊。那么用立即执行函数里嵌套闭包来实现模块化的方式,它的意义在哪里呢

2 个回答
1

已采纳

可以参考阮一峰老师的这一篇博文: http://www.ruanyifeng.com/blo... ,可见你的方法属于其中提到的第一种写法。
本人也是新手前端,了解也不甚深,但是可以略微说一下你疑惑的点:
Q1. 就上面的代码而言,存在变量污染这个问题吗?
A1. 假如你在脚本中直接这样写代码,那么很明显你已经占用了 module 和 mod 两个变量,如果页面后来引入的其他脚本中也使用了名为 module 的变量,你再次想调用 module 的时候,得到的就不再是你想要的结果了,甚至可能抛错,所以变量污染是毋庸置疑的。
Q2. 用立即执行函数里嵌套闭包来实现模块化的方式,它的意义在哪里呢?
A2. 第一个意义是避免 A1 所述的全局变量污染问题;第二个意义在于你可以把一些你不允许从模块外部修改的东西放到闭包里去,比如你本来维护着一个全局唯一的 ID ,结果有某个倒霉蛋不小心导致 ID 重复,如果把这个 ID 放到闭包里,只暴露一个自增的方法来获取 ID ,那么可能只有变量溢出会导致 ID 重复了。

1
回复 尧思阳明与龙场

模块并不是就意味着就需要在别处调用,可以把需要在别处调用的模块称为共有模块,不需调用的称为私有模块。
公有模块比如各种类库,比如jQuery,这些类库导出的对象通常默认是全局的,因此在命名的时候需要考虑你说的这种情况,即不能与其他类库重复;私有模块通常就是一些业务逻辑,这时候并不需要将模块导出,只要在立即执行函数体里完成即可,也就不需要占用任何全局的命名空间,业务逻辑通常需要大量的临时变量,不放到闭包或者挂在私有的命名空间下的话,这些临时变量就是全局的,会占用大量的全局命名空间,命名冲突的概率就更高了。
团队协作的时候,是需要确定每个人导出模块的命名空间,或者定义全局变量的时候需要与他人商定。身为开发者也应有这样的自觉,不随意覆盖已经存在的全局变量,比如你把 jQuery 和 $ 重新赋值一下,后面引用的脚本就 GG 了。

madRain · 18 小时前

展开评论
1

个人认为模块化的意义在于解耦、复用、和安全的上下文
感觉和函数式编程里面纯函数的概念类似:相同的输入总会得到相同的输出;不会改变其他变量等等
你这个 module 勉强也算:无论在什么地方复用 add dec 方法都行

iife 的意义也在于生成单独的命名空间,不污染其他变量

如果有帮到你麻烦 upvote 或采纳

撰写答案

推广链接