美文网首页IT修真院-前端
闭包是什么,如何使用?

闭包是什么,如何使用?

作者: inh_ | 来源:发表于2017-07-23 00:30 被阅读0次

大家好,我是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闭包

详细图解作用域链与闭包


什么是闭包,闭包的作用_腾讯视频

相关文章

  • 闭包

    如何产生闭包? 当一个内部函数引用了外部函数的变量时,就产生了闭包? 闭包到底是什么? 使用chrome调试查看理...

  • 闭包是什么,如何使用?

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

  • 闭包是什么

    闭包是什么? 闭包是一个函数 闭包可以使用在它外面定义的变量 闭包存在定义该变量的作用域中 各种专业文献上的"闭包...

  • 闭包是什么?用处如何?

    【js-04】闭包是什么?用处如何? ...

  • JavaScript闭包

    闭包是什么:闭包是嵌套的内部函数如何产生闭包:当一个嵌套的内部函数引用了嵌套的外部函数的变量时,就产生了闭包 闭包...

  • Swift5 闭包及其应用

    关于如何理解闭包 学习闭包的第一个难点就是理解闭包,可能很多人用了很久的闭包都还不太清楚闭包到底是什么,我这里提供...

  • groovy-闭包

    定义和执行闭包 闭包作为参数返回 闭包作为参数传递 闭包使用外部变量 注意: 闭包可使用(引用)闭包外部定义的变量...

  • 【译】JavaScript进阶 从实现理解闭包

    来源于 现代JavaScript教程闭包章节中文翻译计划本文很清晰地解释了闭包是什么,以及闭包如何产生,相信你看完...

  • iOS开发之Swift篇(7)—— 闭包

    目录 版本 闭包的定义及使用 尾随闭包 逃逸闭包 版本 Xcode 11.0Swift 5.1 闭包的定义及使用 ...

  • Python闭包与几种装饰器浅析

    闭包 闭包是什么?闭包可以保存外部函数的变量,可以增加代码的复用性,那具体闭包的构成是什么? 1. 闭包构成条件 ...

网友评论

    本文标题:闭包是什么,如何使用?

    本文链接:https://www.haomeiwen.com/subject/iypukxtx.html