闭包是什么,如何使用?

大家好,我是IT修真院成都分院第7期的学员韩建名,一枚正直纯洁善良的WEB前端程序员。

1.背景介绍

是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。简单来说,假设函数A在函数B中进行了定义,并且当A在执行时访问了B内部的变量对象,那么B就是一个闭包

2.知识剖析

那么闭包的具体定义是什么呢?当函数可以记住并访问所在的作用域(全局作用域除外)时,就产生了闭包,即使函数是在当前作用域外执行。

这里有几个知识点需要先搞清楚

(1)变量作用域

变量的作用域无非就是两种:全局变量和局部变量。Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。而函数外部不能访问函数内部的局部作用域。这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,实际上声明了一个全局变量

(2)生命周期

函数内部声明的局部变量会随函数的结束而被销毁,即 触发垃圾回收机制

(3)作用域链

作用域链是由当前环境和上层环境的一系变量对象组成,它保证了当前执行环境对符合访问权限的变量和函数的有序访问

我的理解是,但定义在一个函数中的另一个函数被return时就形成了闭包,闭包就是将函数内部和外部连接在一起的一座桥梁。

3.常见问题

以下代码为什么会造成内存泄露?

window.onload = function(){

var el = document.getElementById("id");

el.onclick = function(){

alert(el.id);

}

4.解决方案

内存泄漏的原因:执行这段代码的时候,将匿名函数对象赋值给el的onclick属性;然后匿名函数内部又引用了el对象,存在循环引用,所以不能被垃圾回收机制回收;

修改后的代码:

window.onload = function(){

var el = document.getElementById("id");

var id = el.id; //解除循环引用

el.onclick = function(){

alert(id);

}

el = null; // 将闭包引用的外部函数中活动对象清除

}

5.编码实战

点击按钮会弹出相应的数字0、1、2、3、4

function init({

var pAry = document.getElementsByTagName("button");

for( var i=0; i< pAry.length; i++ ) {

(function(arg){

pAry[i].onclick = function() {

alert(arg);

};

})(i);//调用时参数

}

}

思路:加一层闭包,i以局部变量形式传递给内存函数,在js任务4中的杀人游戏选中的身份死亡有用到。

6.拓展思考

在闭包中的this指向问题

7.参考文献

阮一峰的网络日志:学习Javascript闭包

详细图解作用域链与闭包


什么是闭包,闭包的作用_腾讯视频
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 大家好,我是IT修真院成都分院第6期的学员,一枚正直纯洁善良的前端程序员。今天给大家带来的是闭包是什么,用处如何?...
    lx2487阅读 374评论 0 1
  • ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...
    lzyuan阅读 959评论 0 0
  • 三、闭包和高阶函数 3.1 闭包 3.1.1 变量的作用域 所谓变量的作用域,就是变量的有效范围。通过作用域的划分...
    梁同学de自言自语阅读 1,489评论 0 6
  • 大家好,我是IT修真院北京分院25期的学员,一枚正直纯洁善良的web前端程序员 今天给大家分享一下,修真院官网js...
    be684ac78b0c阅读 278评论 0 0
  • 昨天一个偶然的机会,进驻到这里,没有大喜大悲,内心感慨万分。故事有很多,却不知道从何说起,所以打算以后常常打...
    更迭_71e3阅读 272评论 2 0