初(粗)谈闭包

2017-12-07  本文已影响0人  Mrs_nn

闭包

1 .闭包是一个特殊对象,它由执行上下文(代号A)与在该执行上下文中创建的函数(代号B)共同组成。当B执行时,如果访问了A中变量对象中的值,那么闭包就会产生;在《你不知道的js》中认为函数B为闭包,但是在chrome中和红皮书中认为函数A为闭包。
2 创建闭包主要有3个特点,分别是:
用外层函数封装受保护的变量及内层函数
将内层函数返回到外层函数外部
调用外层函数,获得内层函数的对象

  // demo1.1
  function  foo (){
      var a = 10;
      function bar() {
            return a;
      }
      return bar;
  };
  var bar = foo();
  bar();

反例:

  // demo02
  var fn;
  var m = 20;
  function foo() {
      var a = 2;
      function baz(a) {
          console.log(a);
      }
      fn = baz;
  }
  function bar() {
      fn(m);
  }

  foo();
  bar(); // 20

原因:m属于全局变量,不属于函数foo的内部变量,函数执行时并没有调用其执行上下文中的变量a,所以这并不存在闭包;可见闭包生成的两个必备的条件是:
1、在函数内部创建新的函数;
2、新的函数在执行时,访问了函数的变量对象;

  //demo3
  function factory(){
      var n=1;//局部变量
      return funtion(){
            return n++;
      }
  }
  var icbd=factory();//第一次调用闭包的完成函数
  console.log(icbd());//?
  console.log(icbd());//?
  console.log(icbd());//?

下面是一个示例 — makeAdder 函数:

   function makeAdder(x) {
       return function(y) {
          return x + y;
       };
  }
  var add5 = makeAdder(5);
  var add10 = makeAdder(10);
  console.log(add5(2));  // ?
  console.log(add10(2)); // ?

参考文档:
https://developer.mozilla.org/zh-CN/docs/web/javascript/closures
https://yangbo5207.github.io/wutongluo/ji-chu-jin-jie-xi-lie/si-3001-zuo-yong-yu-lian-yu-bi-bao.html
https://yangbo5207.github.io/wutongluo/ji-chu-jin-jie-xi-lie/liu-3001-zai-chrome-zhong-guan-cha-han-shu-diao-yong-zhan-3001-zuo-yong-yu-lian-3001-bi-bao.html

上一篇 下一篇

猜你喜欢

热点阅读