js的闭包是个老生常谈的东西,自然也是非常的重要,但是让我一句话说明闭包是什么还真是有点困难,还是直接上代码的小例子吧,这是一个闭包非常经典的小示例
for(var i=0;i<10;i++){ (function(i) { var a = document.createElement('a'); a.innerHTML = i +'<br/>'; a.addEventListener('click', function(e) { e.preventDefault(); alert(i); }); document.body.appendChild(a); })(i) }
由于js没有块级作用域只有函数作用域,所以要用函数作用域来限制这个例子里的i,如果没有这个函数作用域,每次alert出来的i都是10,要达想要的效果就只能使用闭包。
但是在es6当中有了新的声明变量的方式let,有了块级作用域,就不必在使用闭包来达到效果
for(let i=0;i<10;i++){ const a = document.createElement('a'); a.innerHTML = i +'<br/>'; a.addEventListener('click', function(e) { e.preventDefault(); alert(i); }); document.body.appendChild(a); }
而闭包一般用来限制和收敛权限,防止污染作用域,下面这个小demo是用来检测是否是第一次加载
function isfirstload(){ var _list = []; return function(id){ if(_list.indexOf(id) >= 0){ return false; } else { _list.push(id); return true; } } } var first = isfirstload(); first(10); //true first(10); //false first(20); //true first(20); //false