Js_闭包

闭包的作用域问题

通过闭包来延长某个作用域的范围

        function foo(){
             var a=10;
             var baz = function(){
                 a*=2;
                 return a;
             };
             return baz;
        };

        var ba = foo();
        ba();//-->20
        ba();//-->40
        var b= ba();
        alert(b);//-->80

a这个变量是保存在 baz这个作用域中
通过闭包调用所有函数,会先在自己的作用域中找,然后依次去上一级中查找
第二次调用时,a的值已经是20


闭包的this问题

         var name = "window";
         var person = {
             name:"zhangsan",
             age:23,
             say:function(){
                 return function(){
                     return this.name;
                 }
             }
         }

         alert(person.say());//得到函数

         alert(person.say()());//得到值  window

当完成person.say()之后,这个函数就调用结束了,在这个函数调用结束之前
this是指向person,但是在调用匿名函数的时候,this就指向window,所以得到的结果是window

         var name = "window";
         var person = {
             name:"zhangsan",
             age:23,
             say:function(){
                 var that = this;
                 return function(){
                     return that.name;
                 }
             }
         }

         alert(person.say());//得到函数
         alert(person.say()());//得到值  zhangsan

闭包的块作用域

         for(var i=0;i<10;i++){

         }

         alert(i);//10

在js中没有块作用域,不管是使用循环还是判断,这个变量会一直存在
当在全局使用某个变量进行循环或者判断之后,这个变量会影响到函数的变量,所以特殊情况不要使用全局变量,而且使用全局变量
在作用于链中是最慢的,解决的方式是闭包

         (function(){
             for(var i=0;i<10;i++){

             }
         })();


         function fn(){
             alert(i);
         }

         fn(); //找不到 i

i 在 (function(){})(); 内部 ,当函数执行完,函数也随之消失


函数的私有变量

         function person(name){
             //此时就没有办法直接访问name这个属性,因为没有this.name
             //要访问name只能通过this.getName,this.setName
             this.setName = function(){
                 name = value;
             }

             this.getName = function() {
                 return name;
             }

         }

         var p = new Person("aa");
         alert(p.name);//没定义

         p.setName("aa");
         alert(p.getName);//aa

如此方式带来的问题就是每个函数都会存储大量的函数
解决的办法就是静态似有变量来解决

         var Person;
         (function(){
         //name在函数结束就消失
             var name = "";
             Person = function(value){
                     name = value;
             }
             Person.prototype.setName = function(value){
                     name =value;
             }
             Person.prototype.getName = function(){
                     return name;
             }

         })();


         var p1 = new  Person("aa");
         alert(p1.getName);//aa
         p1.setName("bb");
         alert(p1.getName);//bb
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值