好程序员技术分享浅谈JavaScript中的闭包
好程序员技术分享浅谈JavaScript中的闭包,js闭包是指有权访问另一个函数作用域中的变量的函数,个人认为js闭包最大的用处就是防止对全局作用域的污染。 试想如果我们把一些仅仅只用到一两次的变量都声明在全局作用域中,最后肯定是容易出错且不可维护的。而闭包最神奇的地方就是能在一个函数外访问函数中的局部变量,把这些变量用闭包的形式放在函数中便能避免污染。
一、闭包是什么?
《JavaScript高级程序设计》中写道:“闭包是指有权访问另一个函数作用域中的变量的函数”,如果用下定义的观点看,这句话就是说“闭包是函数”,我带着怀疑的心态又去网上找了找,发现什么说法都有,终究没能明白闭包的含义,还是看代码来得直接。·
function outter(){
var sky="blue";
function inner(){
console.log(sky);
}
return inner;
}var result=outter();
result(); //"blue"
这段代码就包含一个简单的闭包:outter函数的返回值是一个函数,即inner。inner在outter内部,理所当然能访问到局部变量sky,但当inner作为outter的返回值赋给outter外的全局变量时,神奇的事情发生了:在全局作用域中访问到了sky,这就是闭包。
二、闭包的原理?
每个函数都有自己的执行环境,当一个函数被执行时,它的执行环境就会被推入环境栈,其活动对象(存储环境中定义的变量及函数)加入作用域链中,一旦函数执行完,栈将其环境弹出,活动对象被销毁。
对于上面的例子来说,outter执行完之后将返回inner给了result,outter的执行环境从环境栈弹出,控制权交给全局环境,outter的活动对象理应被销毁。但此时inner已经存储在全局活动对象中了,同时inner需要访问sky,所以outter的活动对象没有被销毁,即使result执行完毕,outter的活动对象依然存在于作用域链中,只有当result被销毁
//code from = null;
outter的活动对象才会彻底释放。
三、闭包有什么用?
说了这么多,闭包到底有什么用呢?我个人认为闭包最大的用处就是防止对全局作用域的污染。 试想如果我们把一些仅仅只用到一两次的变量都声明在全局作用域中,最后肯定是容易出错且不可维护的。而闭包最神奇的地方就是能在一个函数外访问函数中的局部变量,把这些变量用闭包的形式放在函数中便能避免污染。
四、Caveat
· 闭包将函数的活动对象维持在内存中,过度使用闭包会导致内存占用过多;
· 闭包只能取得外部函数中任何变量的最后一个值,在使用循环且返回的函数中带有循环变量时会得到错误结果;
· 当返回的函数为匿名函数时,注意匿名函数中的this指的是window对象。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
PHP环境手动搭建教程
Windows操作系统下手动搭建PHP环境,云吞铺子是以php5.6+MySQL5.6+Apache2.4版本的组合来搭建环境: windows系统手动搭建PHP环境 手动安装PHP环境比较麻烦,云吞铺子先帮大家梳理下: 版本搭配:php5.6+MySQL5.6+Apache2.4 大致流程概述:①下载PHP、MySQL和Apache三款软件;②安装MySQL数据库;③安装和配置Apache服务器;④配置PHP模块到Apache服务器上;⑤配置MySQL。以下详细流程就是按照这五个步骤: 另外,关于LAMP环境可以移步官方的自己动手LAMP开发环境搭建,使用云服务器搭建LAMP环境,本文是关于在本机Windows系统下搭建PHP环境。 一:下载PHP、MySQL和Apache三款软件 1、下载PHP5.6版本 下载地址:https://windows.php.net/download#php-5.6下载注意事项: 本文是以Apache作为服务器环境,所以选择Thread Safe(线程安全)版本; 如果你的Windows是32位系统就选择x86,如果是64位系统就选择x64; 我是Wi...
- 下一篇
C#相等性 - 三个方法和一个接口
C#相等性 - 三个方法和一个接口简介C#(.NET)的object类里面有三个关于判断相等性的方法: public virtual bool Equals(object obj)public static bool Equals(object objA, object objB)public static bool ReferenceEquals(object objA, object objB)还有一个接口:IEquatable也可以用来判断相等性。 virtual bool Equals()比较自定义Class 比较这个Class的两个实例,它们的属性值是一样的: 输出结果: 之所以结果是False,是因为object.Equals()评估的是引用的相等性,除非进行了重写。 比较string这是两个字符串,而且使用string.Copy()可以保证它们不指向同一个地址(如果不使用string.Copy(),而直接赋两个同样的值,那么可能会发生字符串驻留问题:https://www.cnblogs.com/artech/archive/2007/03/04/663728.aspx)...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS6,CentOS7官方镜像安装Oracle11G
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启