闭包
一、闭包:当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏。
//对每一个li ,添加点击事件,利用闭包 var arrLi=document.getElementsByTagName('li'); for(var i=0;i<arrLi.length;i++){ (function(j){ arrLi[j].onclick=function(){ console.log(j) } }(i)) }
二、闭包作用:
1.实现公有变量,不依赖外部变量 eg:函数累加器
function count(){ var num=0; function add(){ num++; console.log(num); } return add; } var demo=count(); demo();//1 demo()//2
2.可以做缓存
function test(){ var food=''; var obj={ pushFood:function(_food){ food=_food; }, eatFood:function(){ console.log('I am eating '+food); } } return obj; } var demo=test(); demo.pushFood('apple');//food='apple' demo.eatFood(); //I am eating apple
3.可以实现封装,属性私有化。
// 继承方法 F为私有化变量 var inherit=(function(){ function F(){}; return function(Target,Origin){ F.prototype=Origin.prototype; Target.prototype=new F(); Target.prototype.constructor=Target;//构造函数指向自己 Target.prototype.uber=Origin.prototype;//记录继承的对象 } }()
4.模块化开发,防止污染全局变量
var init=(function(){ var name=123; function test(){ console.log(name) } return function(){ test(); } })(); init();