资讯专栏INFORMATION COLUMN

我所认识的闭包

lavnFan / 1762人阅读

摘要:哈哈,简单粗暴的理解,不过也对,这样确实是形成了闭包。但有一个方法可以帮我们在外部调取内部的值,没错,这就是闭包我们先继续看这道题,我将一步步解释。第二点就是利用闭包的特点,增加某些的安全性。

(~ ̄(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://www.ucloud.cn/yun/98514.html

相关文章

  • 我所认识闭包

    摘要:哈哈,简单粗暴的理解,不过也对,这样确实是形成了闭包。但有一个方法可以帮我们在外部调取内部的值,没错,这就是闭包我们先继续看这道题,我将一步步解释。第二点就是利用闭包的特点,增加某些的安全性。 (~ ̄(OO) ̄)ブ,闭包,一个面试长问的问题,本白也迷糊了很久。慢慢不断地有了自己的一点认识,这里分享一下~~~废话不多说,先看题: var output = (function () { ...

    _Suqin 评论0 收藏0
  • 我所认识JavaScript作用域链和原型链

    摘要:为了防止之后自己又开始模糊,所以自己来总结一下中关于作用域链和原型链的知识,并将二者相比较看待进一步加深理解。因此我们发现当多个作用域相互嵌套的时候,就形成了作用域链。原型链原型说完了作用域链,我们来讲讲原型链。   毕业也整整一年了,看着很多学弟都毕业了,忽然心中颇有感慨,时间一去不复还呀。记得从去年这个时候接触到JavaScript,从一开始就很喜欢这门语言,当时迷迷糊糊看完了《J...

    Bmob 评论0 收藏0
  • 谈谈我所理解闭包,js、php、golang里closure

    摘要:当初看这个解释有点懵逼,理解成闭包就是函数中的函数了。里的闭包最近不满足于只干前端的活,开始用起了。里的闭包最近在学习语言,让我们来看一下语言里的闭包。在中,闭包特指将函数作为值返回的情况,被返回的函数引用了生成它的母函数中的变量。 本人开始接触编程是从js开始的,当时网上很多人说闭包是难点,各种地方对闭包的解释也是千奇百怪。如今开始接触js以外的各种编程语言,发现不光是js,php、...

    betacat 评论0 收藏0
  • 谈谈我所理解闭包,js、php、golang里closure

    摘要:当初看这个解释有点懵逼,理解成闭包就是函数中的函数了。里的闭包最近不满足于只干前端的活,开始用起了。里的闭包最近在学习语言,让我们来看一下语言里的闭包。在中,闭包特指将函数作为值返回的情况,被返回的函数引用了生成它的母函数中的变量。 本人开始接触编程是从js开始的,当时网上很多人说闭包是难点,各种地方对闭包的解释也是千奇百怪。如今开始接触js以外的各种编程语言,发现不光是js,php、...

    zhoutao 评论0 收藏0

发表评论

0条评论

lavnFan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<