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模块化