当前位置:网站首页 / 技术杂谈 / 正文

简单了解javascript闭包

时间:2019年06月07日 | 作者 : 张端建 | 分类 : 技术杂谈 | 浏览: 476次 | 评论 0

前言:Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C++的程序员来说是一个新的语言特性。本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来使读者可以更深入的理解闭包。

什么是闭包

闭包是静态语言所不具有的一个新特性,简单来说,闭包就是:

函数的局部变量集合,只是这些局部变量在函数返回后会继续存在。
当在一个函数内定义另外一个函数就会产生闭包。

了解了闭包的概念,下面我举个例子来体验一下闭包产生的影响!

示例:

function greeting(name) {
    var text = 'Hello ' + name; // 局部变量
     // 每次调用时,产生闭包,并返回内部函数对象给调用者
     return function () { alert(text); }
}
var sayHello=greeting( "Closure" );
sayHello()  // 通过闭包访问到了局部变量text

上述代码的执行结果是:Hello Closure,因为sayHello()函数在greeting函数执行完毕后,仍然可以访问到了定义在其中的局部变量text,这就是闭包。


ECMAScript闭包模型

ECMAScript到底是如何实现闭包的呢?我在网上搜集了相关资料,给大家简单一说。想深入了解的可以获取ECMAScript 规范进行研究。

在ECMAscript的脚本的函数运行时,每个函数关联都有一个执行上下文场景(Execution Context) ,这个执行上下文场景中包含三个部分

• 文法环境

•变量环境

• this绑定

解释:
其中第三点this绑定与闭包无关,不在本文中讨论。文法环境中用于解析函数执行过程使用到的变量标识符。我们可以将文法环境想象成一个对象,该对 象包含了两个重要组件,环境记录(Enviroment Recode),和外部引用(指针)。环境记录包含包含了函数内部声明的局部变量和参数变量,外部引用指向了外部函数对象的上下文执行场景。全局的上下文 场景中此引用值为NULL。这样的数据结构就构成了一个单向的链表,每个引用都指向外层的上下文场景。

例如上面我们例子的闭包模型应该是这样,sayHello函数在最下层,上层是函数greeting,最外层是全局场景。如下图:

闭包 简单了解javascript闭包 技术杂谈

因此当sayHello被调用的时候,sayHello会通过上下文场景找到局部变量text的值,因此在屏幕的对话框中显示出”Hello Closure”。

博主水平有限,只能帮你到这了。

推荐您阅读更多有关于“JavaScript闭包,”的文章

请在这里放置你的在线分享代码

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。