闭包

作者: 兰夏天 | 来源:发表于2018-02-27 09:08 被阅读0次

    1闭包
    蓝色背景代表不是很明白。
    1闭包会使得函数的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页性能问题。在IE中还可能导致内存泄漏。尽量在退出函数之前,讲不使用的局部变量全部删除。
    2闭包会在父函数外部,改变父函数内部变量的值。所以如果你把父函数当作对象使用,把闭包当作他的公共方法,把内部变量当作它的私有属性,这是一定要小心,不要随便改变父函数内部变量的值。
    3 有权访问另一个函数作用域内变量的函数都是闭包。
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title></title>
    </head>
    <body>
    <script type="text/javascript">
    //情况1 陷阱
    // function f(){
    // var a=[];
    // var i;
    // for(i=0;i<3;i++){
    // a[i]=function(){
    // return i;
    // };
    // 这里返回的时函数引用而不是函数调用。函数不调用就不会执行
    // }
    // return a;
    // }
    // var test=f(); // 此事a[i]=[f,f,f] f是循环三次后的函数即i等于3的时候。for循环已经把i等于3了,而都是指向函数的引用没有调用。
    // alert(test0); // 当开始调用的时候i都是3
    // alert(test1);
    // alert(test2);
    // 以上弹出的都是3。
    //这里的陷阱就是:函数带()才是执行函数! 单纯的一句 var f = function() { alert('Hi'); }; 是不会弹窗的,后面接一句 f(); 才会执行函数内部的代码。上面代码翻译一下就是:

    //情况2
    function f(){
    var a=[];
    var i;
    for(i=0;i<3;i++){
    a[i]=(function(x){
    return function(){
    return x;
    }
    })(i); //注意自调用写法。
    }
    return a;
    }
    var test=f();
    //调用后他的内部FOR循环函数内部已经自调用了,因此
    //a[i]=function(i){return i};
    alert(test0);
    alert(test1);
    alert(test2);

    //情况3
    // function f(){
    // function test(x){
    // return function(){
    // return x;
    // }
    // }
    // var a=[];
    // var i;
    // for(i=0;i<3;i++){
    // a[i]=test(i);
    // }
    // return a;
    // }
    // var res=f();
    // alert(res0);
    // alert(res1);
    // alert(res2);

    </script>

    </body>
    <html>
    4 注意自调用函数的形式, 立即执行的函数
    例如: (function test(){要执行的代码段})();

    相关文章

      网友评论

          本文标题:闭包

          本文链接:https://www.haomeiwen.com/subject/lrkpxftx.html