• 我所认识的闭包


    (~ ̄(OO) ̄)ブ,闭包,一个面试长问的问题,本白也迷糊了很久。慢慢不断地有了自己的一点认识,这里分享一下~~~
    废话不多说,先看题:

    
    var output = (function () {
        var x = y = 7;
        return [
            function () {
                console.log(x)
            },
            function () {
                console.log(y);
            }
        ]
    })();
    for (var i = 0; i < 2; i++) {
        output[i]();
    }
    console.log(++y);
    console.log(++x);
    

    结果是什么呢???
    大家可以先自己想一下,然后来听我分析(xiache)(#^.^#);
    首先我们从for循环开始看起,循环了2次,分别执行了outputp[0]();outputp[1]();
    首先outputp会执行return出一个数组,数组中有两个方法,所以outputp[0]();outputp[1]();会执行数组中的两个方法。

    • 这里就涉及到闭包的知识点了~~~

    第一次听到闭包,别人给我的解释就是,函数中输出函数。
    哈哈,简单粗暴的理解,不过也对,这样确实是形成了闭包。关于闭包,我们就要说到javascript的作用域,我们都知道,js中无非就是全局变量和局部变量。在js中,函数的内部都可以访问的全局变量的值,但在函数外部无法获取内部的值。但有一个方法可以帮我们在外部调取内部的值,没错,这就是闭包~~~
    我们先继续看这道题,我将一步步解释。
    这个是函数内部return函数,形成了闭包。所以我们在外部可以获取到 x,y的值。没错也就是我们可以用outputp[0]();outputp[1]();来获取,也就是会打印 7 7;

    • 为什么可以

    一般的函数,没有return的时候,函数执行完成后也就会关闭了,但闭包会return出来一个函数,所以这个函数不能关闭,所以我们可以利用这个特性,这也就是我所认为的闭包。(萌新,否求指);

    • 继续看

    最后的两行console.log(++y);console.log(++x); 这里我们回到 var x = y = 7;
    等用于 y = 7;var x = y; 所以,y其实是个全局变量。而x是局部变量。
    console.log(++y) 会输出8 因为全局变量在哪都可以访问到
    console.log(++x) 会报错 Uncaught ReferenceError: x is not defined
    有的同学可能要问,既然闭包 也就是x的值还在内存中,为什么访问不到呢,因为我们之前说过,函数外部无法获取内部的值,所以直接调用x是获取不到的,闭包是利用outputp[0]()这种return出的函数调用其父的值x,y才获取的到。

    • 思考

    闭包有什么用呢,本萌新在实战中也用到过几次,但毕竟经验不足。这里就说两点吧。

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

    这个会输出 8 个 8,面试题考烂了的。 如何输出0/1/2/3/4/5/6/7呢
    只要将var i 变成 let i 就可以了。 如果不用es6语法怎么做呢? 这样:

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

    这个也是利用闭包的原理,函数内部可以看父亲函数的值,因为父函数中有子函数,所以每次for循环i的值都在内存中,没有变。

    第二点就是利用闭包的特点,增加某些key的安全性。 比如有一个很重要的信息 “楼主可真是个小机灵鬼”,在一个函数内部,我们在外部想到用它,但不想任何人都可以随便调到,因为这个信息很重要。这样我们就可以这样:

    
    function getKey(){
        var key = "楼主可真是个小机灵鬼";
        return {
             _xxx : (function(){
               return key;
            })()
        }
    };
    console.log(getKey()._xxx)
    

    key我们想自己全局的调用,但不想让同事调用。_xxx可以是一个加密的字符串,我就可以这样写这样我全局的都可以用到。
    这就是本小白对闭包的理解,否佬指(不对的地方,麻烦大佬指出);
    最后祝大家身体健康,谢谢~~~

    来源:https://segmentfault.com/a/1190000016750915

  • 相关阅读:
    1062 Talent and Virtue (25 分)
    1083 List Grades (25 分)
    1149 Dangerous Goods Packaging (25 分)
    1121 Damn Single (25 分)
    1120 Friend Numbers (20 分)
    1084 Broken Keyboard (20 分)
    1092 To Buy or Not to Buy (20 分)
    数组与链表
    二叉树
    时间复杂度与空间复杂度
  • 原文地址:https://www.cnblogs.com/datiangou/p/10173212.html
Copyright © 2020-2023  润新知