资讯专栏INFORMATION COLUMN

闭包?反正看完我就懂了

sean / 538人阅读

摘要:闭包反正看完我就懂了想要好好的理解闭包,你得首先理解作用域。其实这个闭包的产生过程可以理解为在里面的匿名函数定义时正处于怀孕阶段,到外面调用时,娃就出生了,娃就是闭包啦。闭包改变了变量的生命周期,变量将得到永生。

闭包?反正看完我就懂了

想要好好的理解闭包,你得首先理解作用域。别说了,赶紧去看作用域吧,?,这世界就是如此残酷。好,言归正传,我们是来学习闭包的。O(∩_∩)O

什么是闭包??

百度了一波,but理解不了哇。别怕,我来帮你。其实,可以这样理解的:魔术师的幕后藏着一个人,我们要揭开他的伪装,伪装之后的那个人是..知道你会说就是闭包了。闭包就是函数定义时的上下文环境。

get闭包

说了这么久,还不上菜,都快要饿死了。

菜来了!?

闭包只要记住:

闭包产生是:函数内嵌套函数;

闭包函数在外面被调用,访问;

闭包可以访问外部的变量,但是外部的变量不能访问内部;

闭包可以保持对定义时的作用域的引用,使之不被销毁,长生不老。

可能你又懵了,不怕,咱用实例来说话。

实例一:
function foo(){
    var a=2;

    function bar(){
        console.log(a);//2
    }
    bar();
}
foo();

这看起来应该就是闭包吧,不,确切地说它不是。因为bar()嵌套在foo()内部,这里并没有在外面调用bar().

闭包来啦
var func=function(){
    var a=1;
    return function(){
        a++;
        alert(a);
    }
}
var f=func();
f();//闭包哇!

函数f()的词法作用域能够访问func()的内部作用域,然后把里面的匿名函数function()本身当作一个值类型进行传递。其实这个闭包的产生过程可以理解为在里面的匿名函数定义时正处于怀孕阶段,到外面f()调用时,娃就出生了,娃就是闭包啦。

不一般的闭包

有时候对函数类型的值进行参数传递有很多种方法,但是不要方,当他们在别处被调用时仍然可以观察到闭包。
看下面:

function foo(){
    var a=2;

    function baz(){
        console.log(a);//2
    }
    bar(baz);
}
function bar(fn){
    fn();//妈,闭包又来啦
}

把内部的函数baz传递给bar,当调用这个内部函数时(现在叫fn()),它涵盖的foo()内部作用域就出来了,因为它能够访问a.

还有这样的闭包
function wait(message){
    setTimeout(function timer(){
        console.log(message);
    },1000);
}
wait("Hello,closure!");

将一个内部函数(名为timer)传递给setTimeout(...)。timer具有涵盖wait(...)作用域的闭包,还保留着对变量message的引用。

循环和闭包
for(var i=1;i<=5;i++){
    (function(){
        var j=i;
        setTimeout(function trimer(){
            console.log(j);
        },j*1000);
    })();
}

在for循环里面,我们在每个迭代过程中都创建了一个闭包作用域,且作用域内定义了变量,进行了赋值。闭包改变了变量的生命周期,变量将得到永生。

小结:

闭包是隐藏在函数里面却又很厉害的。相信你已经理解了闭包,那么恭喜你,从某种意义上获得了重生!
闭包其实是一种事实,当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包。闭包产生之后能够涵盖它所能访问的词法作用域。

好啦,讲完啦,如果大家觉得有错误或者改进的地方欢迎指出,只求共同进步。?

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84566.html

相关文章

  • JS 中的闭包是什么?

    摘要:大名鼎鼎的闭包面试必问。闭包的作用是什么。看到闭包在哪了吗闭包到底是什么五年前,我也被这个问题困扰,于是去搜了并总结下来。关于闭包的谣言闭包会造成内存泄露错。闭包里面的变量明明就是我们需要的变量,凭什么说是内存泄露这个谣言是如何来的因为。 本文为饥人谷讲师方方原创文章,首发于 前端学习指南。 大名鼎鼎的闭包!面试必问。请用自己的话简述 什么是「闭包」。 「闭包」的作用是什么。 首先...

    Enlightenment 评论0 收藏0
  • ETM时间塔是做什么的,看完这篇文章你就懂了

    摘要:事件去年夺冠,王思聪抽奖。终于说到今天的正题了时间塔是什么它是一个区块链量子随机数发生器。简单地说,时间塔从链上抽取数据,通过一系列高级操作,生成随机数时间塔和有什么关系时间塔是联合知名高校科研机构以及实验室共同开发的科研成果。 以前我一直认为,人类的本质是复读机。实际上,我还是过于年轻了,现实的冷水,终于浇醒了我。 人类的本质,是鸽子。 为什么?你听我说。showImg(https:...

    aisuhua 评论0 收藏0
  • 前端学习笔记之闭包——看了一张图终于明白啥是闭包

    摘要:在一个闭包环境内修改变量值,不会影响另一个闭包中的变量。直到看到函数闭包闭包这篇文章的代码一部分,终于明白其中的逻辑了。 闭包 闭包定义:指拥有多个变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。函数内部可以直接读取全局变量。函数内部变量无法在函数外部访问。函数内部声明要用var或者let声明,不然会变成全局变量链式作用域:子对象会一级级向上寻找...

    andycall 评论0 收藏0
  • 阿里 2021 版最全 Java 并发编程笔记,完我懂了“内卷”的真正意义

    摘要:纯分享直接上干货操作系统并发支持进程管理内存管理文件系统系统进程间通信网络通信阻塞队列数组有界队列链表无界队列优先级有限无界队列延时无界队列同步队列队列内存模型线程通信机制内存共享消息传递内存模型顺序一致性指令重排序原则内存语义线程 纯分享 , 直接上干货! 操作系统并发支持 进程管理内存管...

    不知名网友 评论0 收藏0
  • 分享一波关于做Kaggle比赛,Jdata,天池的经验,完我这篇就够了。

    摘要:但是不能完成的是做成一个可以轻易复用到各种比赛的框架。因为每个比赛的数据大不相同。没什么道理性的,有时候行,有时不行找比赛,这个就是钻空子吧。 @Author : Jasperyang@School : BUPT 这篇文章同时在知乎里放着~ 写在前面 Kaggle的数据挖掘比赛近年来很火,以至于中国兴起了很多很多类似的比赛,做了两个这种类型的比赛了,Jdata用户商品购买预测和用户位置...

    tomlingtm 评论0 收藏0

发表评论

0条评论

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