js闭包

js闭包

作用域链
词法作用域

   // function a(){
        //     alert('aaa');
        //     return function(){
        //         alert('bbb');
        //     };
        // }
        // var func=a();
        // func();
    
        // var a=function(){
        
        //     function setUp(){
        //         var setup='doSomeThing';

        //     }
        //     function doWhat(){
        //         alert('要执行的操作');
        //     }
        //     setUp();
        //     return doWhat;
        // }();
        // a();

    // 作用域链

//   var a=1;
//   function test(){
//       var b=2;
//       function test1(){
//           var c=3;
//           alert(a);
//           alert(b);
//           alert(c);
//           return c;
//       }
//       test1();
//   }
//   test();

// 词法作用域
// function f1(){
//     var a=1;//局部变量
//     return f2();
// }
// function f2(){
//     return a;
// }
// alert(f1());


// 通过闭包突破全局作用域链
// function f(){
//     var a='unclehuang';
//     return function(){
//         return a;
//     }
// }
// var test=f();
// alert(test());

// var n;
// function f(){
//     var a='unclehuang';
//     n=function(){
//         return a;
//     };
// }
// f();
// alert(n());

// function f(param){
//     var n=function(){
//         return param;
//     }
//     param++;
//     return n;
// }
// var test=f(12);
// alert(test());

// function f1(){
//     var n=1;
//     test=function(){
//         n+=1;
//     }
//     function f2(){
//         alert(n);
//     }
//     return f2;
// }
// var res=f1();
// alert(res());

// var setValue,getValue;
// (function(){
//     var n=0;
//     getValue=function(){
//         return n;
//     };
//     setValue=function(x){
//         n=x;
//     };
    
// })();

// alert(getValue());
// setValue(12);
// alert(getValue());

// function test(x){
//     var i=0;
//     return function(){
//         return x[i++];
//     };

// }
// var next=test(['a','b','c','d']);
// alert(next());
// alert(next());
// alert(next());
// alert(next());

// function f() {
//     var a=[];
//     var i;
//     for(i=0;i<3;i++){
//         a[i]=function(){
//             return i;
//         };
//     }
//     return a;
//   }
// var test=f();
// alert(test[0]());
// alert(test[1]());
// alert(test[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();
// alert(test[0]());
// alert(test[1]());
// alert(test[2]());
    
    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(res[0]());
    alert(res[1]());
    alert(res[2]());

注意:
1.闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。尽量在退出函数之前,将不使用的局部变量全部删除。
2.闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公有方法(public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncle_Huang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值