闭包

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.闭包的优缺点

*优点:比较灵活,利于封装

*缺点:会造成空间浪费,消耗性能

posted @ 2015-09-20 10:35  木西梧  阅读(247)  评论(0编辑  收藏  举报