了解js闭包

定义:闭包是由函数以及创建该函数的环境组合而成。这个环境包含了这个闭包创建时所能访问的所有局部变量
理解:能够读取其他函数的内部变量的函数,并开辟新的作用域(环境)

例子1

       function parent() {
              var a = 0;    
        
              function child() {
                console.log(a);
                a++;
              }
              return child;
            }
        
            var p = parent(); 
            p(); 
       p();

 

 

 

 也可以用立即执行函数写

              var parent = function() {
                  var a = 0;
            
                  function child() {
                    console.log(a);
                    a++;
                  }
                  return child;
                }()
            
                parent()
                parent()

两次的结果是为0,1

变量a属于私有变量,保存在同一作用域(环境)的内存中
child函数就相当于闭包函数
再次调用函数p,变量a不会再次声明

例子2

          function parent(a) {
              function child(b) {
                console.log(a + b)
              }
              return child;
            }
        
            var p = parent(1);
            p(3);
        
            var p1 = parent(11);
            p1(3);

         

p和p1共享相同的函数,但是保存在两个不同的作用域,所以不会互相影响

 

闭包用途

  1.针对共享同一个作用域的情况

  2.针对变量只在当前函数的使用,避免污染全局变量

 

例子3

        for (var i = 0; i <= 4; i++) {
              setTimeout(function() {
                console.log(i)
              }, 0)
            }

循环在setTimeout函数开始前就已经执行完毕了,所以得到的i都是最后一项
所以为每一个函数都创建一个作用域,不再共享同一作用域

       for (var i = 0; i <= 4; i++) {
              setTimeout(test(i), 0)
            }
        
            function test(i) {
              return function() {   //闭包
                console.log(i)
              }
            }
        
        或者
  
for (var i = 0; i <= 4; i++) { test(i) } function test(i) { setTimeout(function() { console.log(i) }, 0)      }

还可以用let声明变量,let属于块级作用域

             for (let i = 0; i <= 4; i++) {
                  setTimeout(function() {
                    console.log(i)
                  }, 0)    
                }

 

闭包注意

  由于闭包中的变量保存在内存中,处理速度和内存消耗方面有负面影响,如果不是特殊任务,使用闭包是不需要的

转载于:https://www.cnblogs.com/dongzhi1111/p/11536252.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值