前言: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的脚本的函数运行时,每个函数关联都有一个执行上下文场景(Execution Context) ,这个执行上下文场景中包含三个部分
• 文法环境
•变量环境
• this绑定
解释:
其中第三点this绑定与闭包无关,不在本文中讨论。文法环境中用于解析函数执行过程使用到的变量标识符。我们可以将文法环境想象成一个对象,该对 象包含了两个重要组件,环境记录(Enviroment Recode),和外部引用(指针)。环境记录包含包含了函数内部声明的局部变量和参数变量,外部引用指向了外部函数对象的上下文执行场景。全局的上下文 场景中此引用值为NULL。这样的数据结构就构成了一个单向的链表,每个引用都指向外层的上下文场景。
例如上面我们例子的闭包模型应该是这样,sayHello函数在最下层,上层是函数greeting,最外层是全局场景。如下图:
因此当sayHello被调用的时候,sayHello会通过上下文场景找到局部变量text的值,因此在屏幕的对话框中显示出”Hello Closure”。
博主水平有限,只能帮你到这了。
推荐您阅读更多有关于“JavaScript,闭包,”的文章
额 本文暂时没人评论 来添加一个吧
发表评论