• 了解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)    
                    }

    闭包注意

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

  • 相关阅读:
    Python3.5.2官方文档学习备忘录
    Linux下升级python版本
    役物,役于物
    各种编辑器添加注释快捷键
    Python3爬取百度百科(配合PHP)
    Python3向网页POST数据
    Python3爬取中文网址
    Python3批量爬取网页图片
    django中间件
    django创建上下文
  • 原文地址:https://www.cnblogs.com/dongzhi1111/p/11536252.html
Copyright © 2020-2023  润新知