Js闭包,模块化

js开发会定义各种各样的变量,但是如果多人合作开发,两个使用的是同样的变量名,在html引入js后,变量名会冲突 ,比如说

//小明的xiaoming.js
var name="小明";
var age = 22;
function sum(num1+num2){
    return num1+num2;
}
var flag= true;

//小红的小红.js
var name="小红";
var age = 21;
function sub(num1,num2){
    return num1-num2;
}
var flag= false;
//做完以后小明又写了一个mm.js
//他知道自己的xiaoming.js定义了一个flag所以直接就接着往下写 
if(flag){
   console.log(sum(1,2));
}

但是html的js文件引入顺序是:

<script src="xiaoming.js"></script>
<script src="xiaohong.js"></script>
<script src="mm.js"></script>

小明疯狂检查自己的代码,就是不知道为什么打印不出来

实际上是因为小红也定义了一个flag

这样的话就会产生冲突,导致代码出问题,var是全局变量,function 定义var不是全局变量(全局变量问题参考我的另一篇文章),为了解决冲突问题,于是闭包就出来了

//可以写成这样
(function(){
    //小明的xiaoming.js
    var name="小明";
    var age = 22;
    function sum(num1+num2){
        return num1+num2;
    }
    var flag= true; 
})();
//这样写把自己的代码写入function变量就是只有自己能用了,这种方式叫函数的闭包(closure),
//可以让匿名函数立即被执行(最后面的那对括号就是让上面定义的匿名函数立即执行的秘密)

但是小明怎么才能使用到自己的flag呢?

//可以把xiaoming.js这样写,把小明的闭包写成一个对象,然后在里面返回这个对象

var xiaomingjs=(function(){
        var obj={}; 
        var name ="小明";
        var age = 22;
        function sum(num1+num2){
            return num1+num2;
        }
        var flag = true; 
        obj.sum = sum;
        obj.flag = flag ; 
        return obj;
    })();
    
//mm.js调用
    
if(xiaomingjs.flag){
   console.log(xiaomingjs.sum(1,2));
}

这样就行了,其实就是吧xiaoming.js模块化