美文网首页
闭包笔记

闭包笔记

作者: 101架钢琴 | 来源:发表于2017-03-23 16:13 被阅读0次

    ########js链式作用域:
    1、子对象会一级一级向上寻找父对象的变量,父对象的所有变量,对子对象都是可见的
    2、父对象无法获取子对象内的局部变量

    ########从外部读取局部变量
    方法:在函数的内部,再定义一个函数。
    内部函数可以读取外部函数的局部变量,那把内部函数作为返回值,就可以在外部函数读取内部函数的变量了。

    闭包

    闭包就是能够读取其他函数内部变量的函数
    在立即执行函数中

    Paste_Image.png

    在一个立即执行函数中,有一个局部变量local,有一个函数foo,foo里面可以访问到local变量,这就是一个闭包。

    function foo(){
      var local = 1;
      function bar(){
        local++;
        return local;
      }
      return bar;
    }
    var func = foo();
    func();
    

    这里,local变量和bar函数组成了一个闭包。
    因为需要局部变量,所以把local放在一个函数里,函数套函数只是为了造出一个局部变量,与闭包无关。
    return bar只是为了bar能被使用,也与闭包无关。

    闭包用途

    1、读取函数内部的变量
    2、让这些变量的值始终保持在内存中

    ************我是分割线*******************************

    例子:让下面的函数输出3

    var fnArr = [];
    for (var i = 0; i < 10; i ++) {    
        fnArr[i]=function(){
          return i;
        };
    }
    console.log( fnArr[3]() );//10
    
    1、形成闭包:加入立即执行函数
    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
      (function(n){
        fnArr[i]=function(){
          return n;
        };
      })(i);    
    }
    console.log( fnArr[3]() );//3
    
    2、形成闭包
    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
      (function(){
        var n=i;
        fnArr[i]=function(){
          return n;
        };
      })();    
    }
    console.log( fnArr[3]() );
    
    3、形成闭包
    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        fnArr[i] =(function(){
          var n=i;
          return function(){
            return n;
          }        
        })();       
    }
    console.log( fnArr[3]() );
    

    此篇仅是看过的几篇关于闭包文章的一个笔记而已,摘取了一些文章的精华记录下来:
    https://zhuanlan.zhihu.com/p/22486908JS 中的闭包是什么?
    http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html学习Javascript闭包(Closure)

    相关文章

      网友评论

          本文标题:闭包笔记

          本文链接:https://www.haomeiwen.com/subject/oaignttx.html