闭包是什么、用处如何

大家好,我是IT修真院武汉分院第五期的学员,一枚正直纯洁善良的web程序员

今天给大家分享一下,修真院官网JS任务4,深度思考中的知识点——闭包是什么、用处如何

1.背景介绍

在《JavaScript高级程序设计(第3版)》中文版中[3],具体描述在第7章函数表达式第7.2节(页码为第178页):闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。

阮老师的理解是:“闭包就是能够读取其他函数内部变量的函数”。并且认为:“可以把闭包简单理解成‘定义在一个函数内部的函数’”

先抛开对于两个出处的具体描述,至少两者对于闭包的定义可以简化为: “闭包是一种函数”,而且闭包是一种特殊的函数。以上两个出处涉及到了一些概念(或名词):函数、内部变量、函数内部、函数作用域.

2.知识剖析

变量的作用域

变量的作用域无非就是两种:全局变量和局部变量。

Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。

值得注意的是在局部变量中定义变量的时候要使用var ,不然你声明的其实是一个全局变量。

3.常见问题

如何从外部读取局部变量?

4.解决方案

我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。所以我们需要在函数内部再定义一个函数.

function f1(){

var n=999;

function f2(){

alert(n);

}

}

在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,就可以在f1外部读取它的内部变量了

5.编码实战

6.扩展思考

闭包的用途

闭包可以用在很多地方,最大用处有俩个,一个是他能读取函数内部的变量,另一个就是让函数的变量始终保存在内存中。

function f1(){

var n=999;

nAdd=function(){n+=1}

function f2(){

alert(n);

}

return f2;

}

var result=f1();

result(); // 999

nAdd();

result(); // 1000

在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。

为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。

7.参考文献

学习javaScript闭包

8.更多讨论

在闭包中的this指向问题


闭包中this的指向问题?

在闭包中,this会指向window对象

this为什么会指向window对象?

而此属性方法内部的匿名立即执行函数是独立的,其this指向自身的执行上下文,引用不到外部的对象,所以是undefined

使用闭包会发生什么问题?

ie中可能会发生垃圾无法回收的情形


ppt:ppt

视频链接:


闭包是什么、用处如何_腾讯视频

技能树.IT修真院

“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~

我的邀请码:83020780,或者你可以直接点击此链接:http://www.jnshu.com/login/1/83020780

你可能感兴趣的:(闭包是什么、用处如何)