JavaScript 闭包环境非常奇特 - 相当于类与实例的关系?!

简介:

JavaScript 闭包环境非常奇特 - 相当于类与实例的关系?!


太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的漂亮人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino否则。出自本博客的文章拒绝转载或再转载,谢谢合作。



又一个疑问贴!

只是我相信。问题并非难在怎样解决。终于就是个能解决与不能解决,这非常easy!

但当你无法决断能否否解决,与怎样解决的时侯。这才是最让人纠结的事情。谁说不是呢?!

JavaScript 指南 - 闭包 

这篇转载,看了三遍了。好像没记住太多,只是有些明确了,闭包的含义。这当然得包含它的习性。要不怎么能算得上了解呢。

以下是一个更有意思的演示样例 — makeAdder 函数:

1
2
3
4
5
6
7
8
9
10
11
<code class = " language-js"  style= "margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-weight: inherit; font-family: Consolas, Monaco, 'Andale Mono', monospace; color: inherit; text-shadow: none; direction: ltr; word-spacing: normal; word-break: normal; tab-size: 4;" ><span class = "token keyword"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(0, 119, 170);" > function </span> <span class = "token function"  style= "margin: 0px; padding: 0px; border: 0px;" >makeAdder<span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >(</span></span>x<span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >)</span> <span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >{</span>
   <span class = "token keyword"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(0, 119, 170);" > return </span> <span class = "token keyword"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(0, 119, 170);" > function </span><span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >(</span>y<span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >)</span> <span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >{</span>
     <span class = "token keyword"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(0, 119, 170);" > return </span> x <span class = "token operator"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(166, 127, 89); background: rgba(255, 255, 255, 0.498039);" >+</span> y<span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >;</span>
   <span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >}</span><span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >;</span>
<span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >}</span>
 
<span class = "token keyword"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(0, 119, 170);" > var </span> add5 <span class = "token operator"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(166, 127, 89); background: rgba(255, 255, 255, 0.498039);" >=</span> <span class = "token function"  style= "margin: 0px; padding: 0px; border: 0px;" >makeAdder<span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >(</span></span><span class = "token number"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 0, 85);" >5</span><span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >)</span><span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >;</span>
<span class = "token keyword"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(0, 119, 170);" > var </span> add10 <span class = "token operator"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(166, 127, 89); background: rgba(255, 255, 255, 0.498039);" >=</span> <span class = "token function"  style= "margin: 0px; padding: 0px; border: 0px;" >makeAdder<span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >(</span></span><span class = "token number"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 0, 85);" >10</span><span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >)</span><span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >;</span>
 
<span class = "token function"  style= "margin: 0px; padding: 0px; border: 0px;" >print<span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >(</span></span><span class = "token function"  style= "margin: 0px; padding: 0px; border: 0px;" >add5<span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >(</span></span><span class = "token number"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 0, 85);" >2</span><span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >)</span><span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >)</span><span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >;</span> <span class = "token comment"  spellcheck= "true"  style= "margin: 0px; padding: 0px; border: 0px; display: inherit; color: rgb(112, 128, 144);" > // 7
</span><span class = "token function"  style= "margin: 0px; padding: 0px; border: 0px;" >print<span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >(</span></span><span class = "token function"  style= "margin: 0px; padding: 0px; border: 0px;" >add10<span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >(</span></span><span class = "token number"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 0, 85);" >2</span><span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >)</span><span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >)</span><span class = "token punctuation"  style= "margin: 0px; padding: 0px; border: 0px; color: rgb(153, 153, 153);" >;</span><span class = "token comment"  spellcheck= "true"  style= "margin: 0px; padding: 0px; border: 0px; display: inherit; color: rgb(112, 128, 144);" > // 12</span></code><div class="line-number" data-start="1" style="margin: 1em 0px 0px; padding: 0px; border: 0px; position: absolute; left: 0px; right: 0px; pointer-events: none; line-height: inherit; top: 0px; background: transparent;"></div><div class="line-number" data-start="2" style="margin: 1em 0px 0px; padding: 0px; border: 0px; position: absolute; left: 0px; right: 0px; pointer-events: none; line-height: inherit; top: 19px; background: transparent;"></div><div class="line-number" data-start="3" style="margin: 1em 0px 0px; padding: 0px; border: 0px; position: absolute; left: 0px; right: 0px; pointer-events: none; line-height: inherit; top: 38px; background: transparent;"></div><div class="line-number" data-start="4" style="margin: 1em 0px 0px; padding: 0px; border: 0px; position: absolute; left: 0px; right: 0px; pointer-events: none; line-height: inherit; top: 57px; background: transparent;"></div><div class="line-number" data-start="5" style="margin: 1em 0px 0px; padding: 0px; border: 0px; position: absolute; left: 0px; right: 0px; pointer-events: none; line-height: inherit; top: 76px; background: transparent;"></div><div class="line-number" data-start="6" style="margin: 1em 0px 0px; padding: 0px; border: 0px; position: absolute; left: 0px; right: 0px; pointer-events: none; line-height: inherit; top: 95px; background: transparent;"></div><div class="line-number" data-start="7" style="margin: 1em 0px 0px; padding: 0px; border: 0px; position: absolute; left: 0px; right: 0px; pointer-events: none; line-height: inherit; top: 114px; background: transparent;"></div><div class="line-number" data-start="8" style="margin: 1em 0px 0px; padding: 0px; border: 0px; position: absolute; left: 0px; right: 0px; pointer-events: none; line-height: inherit; top: 133px; background: transparent;"></div><div class="line-number" data-start="9" style="margin: 1em 0px 0px; padding: 0px; border: 0px; position: absolute; left: 0px; right: 0px; pointer-events: none; line-height: inherit; top: 152px; background: transparent;"></div><div class="line-number" data-start="10" style="margin: 1em 0px 0px; padding: 0px; border: 0px; position: absolute; left: 0px; right: 0px; pointer-events: none; line-height: inherit; top: 171px; background: transparent;"></div><div class="line-number" data-start="11" style="margin: 1em 0px 0px; padding: 0px; border: 0px; position: absolute; left: 0px; right: 0px; pointer-events: none; line-height: inherit; top: 190px; background: transparent;"></div>

在这个演示样例中,我们定义了 makeAdder(x) 函数:带有一个參数 x 并返回一个新的函数。返回的函数带有一个參数 y。并返回 x 和 y 的和。


能否够这样理解,闭包中的函数或变量有被外部引用。这个闭包环境就一直存在着,以便其内部类或变量參与运算时,环境还在。

那么再或者,这个闭包能否够当成是一个类呢?而事实上例对象确是个看不到摸不着。确能随其成员的销毁而销毁的后台英雄呢。这就是闭包环境吧,也就是闭包相当于类,闭包环境相当于类的实例,拥有着一份独一无二,不随类存在的成员变量环境。


并且。闭包能够定义的同一时候运行,那必须在后面加上 (),这就是函数调用的那两个左右括号。

但到眼下尚未找到我须要的部分,难道还有其他的运行方式?









本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5097733.html,如需转载请自行联系原作者

相关文章
|
1月前
|
设计模式 JavaScript 前端开发
在JavaScript中,继承是一个重要的概念,它允许我们基于现有的类(或构造函数)创建新的类
【6月更文挑战第15天】JavaScript继承促进代码复用与扩展,创建类层次结构,但过深的继承链导致复杂性增加,紧密耦合增加维护成本,单继承限制灵活性,方法覆盖可能隐藏父类功能,且可能影响性能。设计时需谨慎权衡并考虑使用组合等替代方案。
37 7
|
1月前
|
自然语言处理 JavaScript 前端开发
JavaScript闭包是函数访问外部作用域变量的能力体现,它用于封装私有变量、持久化状态、避免全局污染和处理异步操作。
【6月更文挑战第25天】JavaScript闭包是函数访问外部作用域变量的能力体现,它用于封装私有变量、持久化状态、避免全局污染和处理异步操作。闭包基于作用域链和垃圾回收机制,允许函数记住其定义时的环境。例如,`createCounter`函数返回的内部函数能访问并更新`count`,每次调用`counter()`计数器递增,展示了闭包维持状态的特性。
34 5
|
8天前
|
JavaScript IDE 持续交付
阿里云云效产品使用合集之如何配置 Node.js构建任务让其在Windows环境中进行
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
1月前
|
JavaScript 前端开发
记录Javascript数组类练习
记录Javascript数组类练习
14 1
|
1月前
|
设计模式 自然语言处理 JavaScript
JavaScript进阶-函数表达式与闭包
【6月更文挑战第18天】JavaScript函数不仅是代码块,还是值,具备函数表达式和闭包等特性。函数表达式如匿名函数,可赋值、传参,但不提升,过度使用影响可读性。闭包允许访问外部作用域,即使父函数已结束,但不当使用可能导致内存泄漏。理解并妥善处理这些问题,如命名函数表达式、及时释放引用,能提升代码质量。通过实践深化对这些关键概念的理解至关重要。
|
1月前
|
JavaScript 前端开发 Java
【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析
【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析
27 2
|
1月前
|
存储 JavaScript 前端开发
【JavaScript】JavaScript 中的 Class 类:全面解析
【JavaScript】JavaScript 中的 Class 类:全面解析
31 1
|
18天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的环境保护生活App附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的环境保护生活App附带文章源码部署视频讲解等
20 0
|
21天前
|
JavaScript 索引
js 类数组 转 数组
js 类数组 转 数组
19 0
|
23天前
|
存储 缓存 JavaScript
js 【详解】闭包
js 【详解】闭包
19 0