闭包
1. 函数作为返回值
function fn(){ var max = 10; return function f1(x){ if(x > max){ console.log(x); } } } var f2 = fn();//调用fn函数,并把返回值存放在f1中 console.log(f2);// function f1(x){if(x > max){console.log(x);}} f2(22);//调用f2,相当于调用f1
局部变量在函数执行完成之后未被销毁
2. 函数作为参数被传递
var max = 10;//全局作用域 function f1(x){ if(x > max){ //此处max是全局作用域里的max,在该函数声明时就已经确定 console.log(x);//11 console.log("全局的max:" + max);//10 } } (function fn(f){//匿名函数 var max = 100;//该处的max是局部变量,在fn作用域内使用. f(11); console.log("fn里的max:" + max); })(f1);
自由变量在函数声明时已经确定了其作用域
3.闭包的运用
*循环闭包
<ul id = "ul">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<ul>
<li>11</li>
<li>12</li>
<li>13</li>
</ul>
var lis = document.getElementById("ul").getElementsByTagName("li");
for(var i = 1;i < lis.length;i++){
(function(i){
lis[i].onclick = function(){
console.log(i);
}
})(i);
}
*封装闭包

4.闭包的优缺点
*优点:比较灵活,利于封装
*缺点:会造成空间浪费,消耗性能

浙公网安备 33010602011771号