闭包简述
闭包的产生
如下代码所示:当内部函数被保存到外部时就产生闭包
优点:防止污染全局变量
缺点:闭包会导致原有作用域链不释放,从而造成内存泄漏
function a(){
function b(){
var bbb=234;
console.log(aaa);
}
var aaa=123;
return b;
}
var glob=100;
var demo=a();
demo();
闭包的作用
1、实现公有变量
使用闭包实现累加器
function add(){
var count=0;
function demo(){
count++;
console.log(count);
}
return demo;
}
var con=add();
con();
2、可以做缓存(存储结构)
function eater(){
var food='';
obj={
eat:function (){
console.log('i am eating '+food) ;
food='';
},
push:function (myfood){
food=myfood;
}
}
return obj;
}
var res=eater();
res.push('appel');
res.eat();
3、变量私有化(命名空间:防止污染全局变量)
var name='bcd';
var init=(function(){
var name='abc';
function callName(){
console.log(name);
}
return function(){
callName();
}
}());
init();
立即执行函数
立即执行函数
针对初始化功能的函数 此类函数没有声明且只会执行一次 执行完毕后立即销毁
立即执行函数同样有返回值 只有函数表达式才能被执行符号执行
(function (a,b,c){
console.log(a*b+c);
}(1,2,3));
举例
以下代码执行结果为 十个10
function test(){
var arr=[];
for(var i=0;i<10;i++){
arr[i]=function(){
document.write(i);
}
}
return arr;
}
var res=test();
for(var i=0;i<10;i++){
console.log(res[i]());
}
使用立即执行函数后
以下代码执行结果为打印0~~9
function test(){
var arr=[];
for(var i=0;i<10;i++){
(function (j){
arr[j]=function(){
document.write(j);
}
}(i));
}
return arr;
}
var res=test();
for(var i=0;i<10;i++){
console.log(res[i]());
}