闭包梳理!!

这个概念听过无数遍了?一口答上来?

什么事闭包?

官方概念:闭包是指有权访问另一个函数作用域中变量的函数!!!

三个关键字 : 有权! 另一个函数作用域中变量! 函数!

有权?  如何实现?

父级函数作用域链销毁,但活动对象被闭包引用,仍然驻留内存,可赋值null销毁。

关于经典js  循环闭包理解

click时需要alert(i)  这个i在匿名函数内没有定义,所以要到父及函数内查询,得到4。所以就会alert4

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

这个例子也一样,i得到的值为10;

如何解决?

在理解闭包以前.最好能先理解一下作用域链的含义,简单来说,作用域链就是函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在最前面,把自身的父级函数中的变量放在其次,把再高一级函数中的变量放在更后面,以此类推直至全局对象为止.当函数中需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量中先找,如果没有找到对应的变量,则到下一级的链上找,一旦找到了变量,则不再继续.如果找到最后也没找到需要的变量,则解释器返回undefined.

  了解了作用域链,我们再来看看js的内存回收机制,一般来说,一个函数在执行开始的时候,会给其中定义的变量划分内存空间保存,以备后面的语句所用,等到函数执行完毕返回了,这些变量就被认为是无用的了.对应的内存空间也就被回收了.下次再执行此函数的时候,所有的变量又回到最初的状态,重新赋值使用.但是如果这个函数内部又嵌套了另一个函数,而这个函数是有可能在外部被调用到的.并且这个内部函数又使用了外部函数的某些变量的话.这种内存回收机制就会出现问题.如果在外部函数返回后,又直接调用了内部函数,那么内部函数就无法读取到他所需要的外部函数中变量的值了.所以js解释器在遇到函数定义的时候,会自动把函数和他可能使用的变量(包括本地变量和父级和祖先级函数的变量(自由变量))一起保存起来.也就是构建一个闭包,这些变量将不会被内存回收器所回收,只有当内部的函数不可能被调用以后(例如被删除了,或者没有了指针),才会销毁这个闭包,而没有任何一个闭包引用的变量才会被下一次内存回收启动时所回收.

时间: 2024-12-20 22:01:36

闭包梳理!!的相关文章

JS核心知识点梳理——闭包

闭包 闭包这个东西咋说呢,不同的程序员,不同的资料都有不同的解释,你可以把它理解成一个函数,也可以把它理解函数+执行环境. 我们这里不纠结闭包的定义,而是关注闭包的现象,应用,再结合相关面试题去攻克它,最后谈一下我对闭包的理解. 现象 之前说过,函数执行,生成执行环境,函数执行完,销毁执行环境.嗯,听上去很正常,不用的东西就销毁嘛. 但是如果函数执行完,该函数上下文还用怎么办,有用的东西肯定不敢销毁了,这个就是闭包的现象,那么引起这个现象的鄙人就把它理解成闭包! 1 function foo (

前端团队成长计划(一):基础知识梳理

一个月前我开始了前端团队的成长计划,主要主语两方面的考虑:校招应届生能快速进入工作的状态达到一个能支撑业务的技能水平,提前学习主流前端技术,为未来的业务代码重构做储备.5月是整个计划的第一个阶段,主要的任务是,梳理常规前端基础知识和开发技能. 5月的计划如下:(偏基础) 1.js和css的一些规范以及常规功能如何实现: 2.了解现有业务工程的开发,部署,上线流程以及原理,做到可交叉维护: 3.初步了解gulp,为下一阶段做准备. 4.了解PC开发中常见的问题以及IE浏览器的兼容方式(IE8+)

JavaScript的闭包理解

由于本人是做java web 开发的,对js只是存在很浅的理解,js闭包的概念很早就听说了,但是一直都不明白是什么意思,今天准备梳理一下闭关的概念; 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收机制回收 闭包的定义及其优缺点 闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个

JAVASCRIPT的一些知识点梳理

春节闲点,可以安心的梳理一下以前不是很清楚的东东.. 看的是以下几个URL: http://web.jobbole.com/82520/ http://blog.csdn.net/luoweifu/article/details/41466537 http://javascriptissexy.com/understand-javascript-closures-with-ease/ http://javascriptissexy.com/javascript-variable-scope-an

循环闭包的影响以及其解决方案

上一次,我已经讲过闭包是如何形成的,以及它的用途.但是对于循环闭包产生的陷阱,和解决方案一笔带过啊(根本就没有)!本着不坑爹的思想,绝逼是要重新再梳理一遍.但无论如何还是要强调一下的,在闭包中会一直引用变量(是引用而不是副本),直到其断开连接不再引用,在内存中的闭包就可以得到释放.所以当我们知道这个道理之后,我们就可以开始我们今天的旅程了. 上次的例子举的不够好,竟然要操作DOM的,这次我们换个更直观的写法,用setTimeout函数. show code! 这一次使用的是定时器setTimeo

JavaScript利用闭包循环绑定事件

我们经常在做前端面试题的时候,会遇到循环绑定事件后,输出打印结果,很多人总是搞不清楚,今天借此机会跟大家梳理一下闭包相关作用. 1.首先我们举一个简单的例子. html部分: <a href="#">首页</a> <a href="#">作品</a> <a href="#">文章</a> <a href="#">工具</a> <

JS详细图解作用域链与闭包

JS详细图解作用域链与闭包 攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你是初入前端的朋友,我没有办法直观的告诉你闭包在实际开发中的无处不在,但是我可以告诉你,前端面试,必问闭包.面试官们常常用对闭包的了解程度来判定面试者的基础水平,保守估计,10个前端面试者,至少5个都死在闭包上. 可是为什么,闭包如此重要,还是有那么多人没有搞清楚呢?是因为大家不愿意学习吗?还真不是,

ES基础知识与高频考点梳理

知识点梳理目录列表 变量类型 JS的数据类型分类和判断 值类型和引用类型 原型与原型链(继承) 原型和原型链的定义 继承写法 作用域和闭包 执行上下文 this 闭包是什么 异步 同步VS异步 异步和单线程 前端异步的场景 ES6/7新标准的考查 箭头函数 module class set和map promise 变量类型 JavaScript是一种弱类型脚本语言,所谓弱类型指的是定义变量时,不需要什么类型,在程序运行过程中会自动判断类型 ECMAScript中定义了6种原始类型 boolean

js基础梳理-内存空间

我估计有很多像我这样非计算机专业的人进入到前端之后,总是在写业务代码,思考什么什么效果如何实现,导致很多基础概念型的东西都理解得并不太清楚.经常一碰到群里讨论的些笔试题什么的,总觉得自己像是一个假前端似的,似懂非懂,就算会做也不能清楚的表述为什么会是那样的结果.总是自己安慰自己,反正正常项目很少这么写代码.不知道也没关系,但是时间久了,发现不深刻系统的理解这些东西,工作中经常碰到一些莫名其妙的坑,或者有时候觉得看别人插件的代码,别人究竟是如何一步步实现的? 慢慢的就有了越来越强的想法把这些基础知