4. Scope和Closure
@吴穹Adam(新浪)
注:在阅读本节之前,请先阅读1-3,http://blog.csdn.net/adwu73/article/details/7229563
Scope是JS中非常关键的概念,搞清楚它,才能搞清楚闭包(Closure)。对Scope的解释,JavaScript: The Definitive Guide这本书解释的非常清楚,而JavaScript: The Good Parts则没怎么解释清楚。下面我们以这个程序为例来说明Scope和Closure:
对于一个JS程序而言,都有一个Global Scope Object, 我们定义的全局变量,其实都是这个对象的属性,在主程序体中,可以用this来访问这个对象的内容,这时Scope Chain当中只有一个Global Scope Object。
根据下述原则,执行完var Counter = function() {…}之后,系统中的对象示意如下:
Scope原则1: 当函数F被定义时,JS会把当前有效的Scope Chain保存在函数对象F当中备查
之后执行var counter1 = new Counter;根据下面的原则,系统对象示意如下:
Scope原则2:当一个函数被执行时,会创建一个新的Scope Object,再将函数内容完全分析一遍,将参数和局部变量都加成新Scope对象的属性,最后将新Scope Object作为Scope Chain的最后一节,更新Current Scope Chain。
Scope Chain的作用在于之后查找属性时,如果本Scope查不到,就去父Scope里面查,直到Global Scope Object。感觉其实也是Delegation,所以说不定,Scope Object之间也是用__proto__来连接的呢?
之后Counter的内容被执行,increment和getValue两个函数被定义,之后被返回给counter1,根据原则1,这时系统的对象示意如下:
而执行var counter2 = new Counter之后,对象示意变成:
看到上述对象模型,我想大家就不会意外下面这段代码的输出是这样的:
counter1.increment();
document.writeln("counter1: "+counter1.getValue());
document.writeln("counter2: "+counter2.getValue());
本来嘛,给玩各的,会不干扰!
最后,我们给出闭包的定义,一个函数F的内部函数G可以访问F定义的局部变量和参数,这就叫闭包,它是在JS中实现封装的基础!
为了叙述的方便,我们在这节中忽略了一些有关JS内存管理的细节,有关垃圾收集和堆栈,将在下一节分解!(补充:后来看了一下,你可以认为JS的一切内存都是从直接从里面分配的,没有传统栈的概念,对象不用自己释放,统一有垃圾收集负责,因此,下一节就写别的了)
补记:推荐大家去看一下这个博客,解释的会更详细,有更多例子: http://www.cnblogs.com/TomXu/archive/2011/12/15/2288411.html
分享到:
相关推荐
–js:javascript文件名,可以指定多个 –js_output_file:主要输出文件,如果没有指定,压缩后的文件将用标准输出输出 –compilation_level[WHITESPACE_ONLY | SIMPLE_OPTIMIZATIONS
ug1292-ultrafast-timing-closure-quick-reference.pdf
rpm -ivh perl-Eval-Closure-0.14-30.1.noarch.rpm rpm -ivh perl-MRO-Compat-0.13-32.1.noarch2.rpm rpm -ivh perl-Role-Tiny-2.000006-4.1.noarch.rpm rpm -ivh perl-Sub-Exporter-Progressive-0.001013-2.1....
百度编辑器ueditor编译的时候,需要的一个压缩包,该压缩包是从google获取的,下载地址为https://dl.google.com/closure-compiler/compiler-latest.tar.gz,
closure-compiler-maven-plugin.zip,google闭包编译器maven pluginmaven plugin用于使用google闭包编译器编译javascript
3.JavaScript 闭包 4.JavaScript 事件 5.javascript 跨域 6.javascript 命名空间 Oject-Oriented 1.JavaScript Expressive 2. Interfaces 3.Introduction 4. Inheritance 5.AOP Jquery [jQuery][9] [jQuery...
Fixed bug #75186 (Inconsistent reflection of Closure:::__invoke()). Session: Fixed bug #77911 (Wrong warning for session.sid_bits_per_character). SOAP: Fixed bug #77945 (Segmentation fault when ...
如何编译两个片段 python ../closure-library/closure/bin/calcdeps.py \-i ../closure-library/closure/goog/deps.js \-i checkbox.js \-i tab-nav.js \-p ../closure-library/closure/goog/ \-o compiled \-c ../...
ultrafast方法学快速参考指南
3.JavaScript 闭包 4.JavaScript 事件 5.javascript 跨域 6.javascript 命名空间 Oject-Oriented 1.JavaScript Expressive 2. Interfaces 3.Introduction 4. Inheritance 5.AOP Jquery [jQuery][9] [jQuery...
3.JavaScript 闭包 4.JavaScript 事件 5.javascript 跨域 6.javascript 命名空间 Oject-Oriented 1.JavaScript Expressive 2. Interfaces 3.Introduction 4. Inheritance 5.AOP Jquery [jQuery][9] [jQuery...
closure-compiler-npm, 用于管理和记录关闭编译器的包,通过npm使用 google-closure-compiler 用闭包编译器检查。编译。优化和压缩 Javascript这个库跟踪发布到 npmjs.org 和相关插件的相关问题。 任何与插件无关的...
Vivado Design Suite Tutorial Design Analysis and Closure Techniques vivado-design-suite UG938 (v2022.2) November 2, 2022
capture-replay-framework.zip,该框架通过捕获真实数据将测试数据生成提升到一个新的层次。而不是
资源来自pypi官网。 资源全名:closure_tree-0.1.0-py2.py3-none-any.whl
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
求文法的closure闭包,针对每个产生式,求其closure闭包,并打印输出
前端大厂最新面试题-closure.docx