博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript/数据类型/function/closure闭包
阅读量:6159 次
发布时间:2019-06-21

本文共 847 字,大约阅读时间需要 2 分钟。

感谢 与


什么是闭包?

闭包,Closure.先不要从名称来猜想其作用,因为不管是中文还是英文,都很难理解这个词。

JS有一种特殊的变量作用域:

  • 函数内部可以直接读取全局变量
  • 函数外部无法读取函数局部变量

那么,如何从外部读取函数内部变量?如下:

function f1(){    var n=999;    function f2(){      alert(n);     }    return f2;  }  var result=f1();  result(); // 999  

f2就是closure,闭包

以下是阮老师的原话:

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"
定义在一个函数内部的函数"。
所以,在本质上,
闭包就是将函数内部和函数外部连接起来的一座桥梁

闭包可以干嘛?

闭包最大的作用,有两个:读取函数内部的变量,并且将这些变量保存在内存中。

请看:

function f1(){    var n=999;    nAdd=function(){n+=1}    function f2(){      alert(n);    }    return f2;  }  var result=f1();  result(); // 999  nAdd();  result(); // 1000 

为什么会弹出1000?n没有别重新声明为999吗?

因为nAdd是全局变量,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
闭包通过这种方式起作用了。


to be countinued...

转载地址:http://bbofa.baihongyu.com/

你可能感兴趣的文章
文件操作模式扩展、游标操作
查看>>
Java获取电脑硬件信息
查看>>
qhfl-7 结算中心
查看>>
tilecache2.11在windows apache2.22安装部署
查看>>
Greenplum table 之 外部表
查看>>
答读者问(6):有关IT培训和毕业之前的迷茫等问题
查看>>
【HDOJ 5384】Danganronpa
查看>>
大学暑假第四周进度报告
查看>>
图的存储之链式前向星
查看>>
IOS 通讯录 右侧的字母栏
查看>>
PHP脚本占用内存太多,解决方案
查看>>
BFC自适应布局
查看>>
抓取页面图片元素并保存到本机电脑
查看>>
标签有关用法以及锚点定位;
查看>>
javascript中的异步编程
查看>>
CodeForces 903E Swapping Characters
查看>>
SQL 给字符串补0
查看>>
qq群之思考
查看>>
Java switch case
查看>>
Xen安装部署和基本原理
查看>>