热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【js闭包】

愈来愈以为国内没有教书育人的气氛,为了弄懂JS的闭包,我使出了我英语四级吃奶的劲去google上征采着有封闭包的诠释,当我看到stackoverflow上这一篇解答,我脑中就涌现了

愈来愈以为国内没有教书育人的气氛,为了弄懂JS的闭包,我使出了我英语四级吃奶的劲去google上征采着有封闭包的诠释,当我看到stackoverflow上这一篇解答,我脑中就涌现了一句话:就是这货没跑了!
  鄙人译文见下,见笑了。
  Peter Mortensen问:
就像老Albert所说的,“假如你不能向一个六岁的孩子诠释清晰,那末实在你自身基础就没弄懂。”好吧,我试着向一个27岁的朋侪就是JS闭包(Javascript closure)却完全失利了。
你们会怎样把它诠释给一个充溢好奇心的六岁孩子听呢?
注:我看过StackOverflow上给出的示例,但基础没用。
  Ali的回复:
  当function里嵌套function时,内部的function能够接见外部function里的变量。

function foo(x) {
var tmp = 3;
function bar(y) {
alert(x + y + (++tmp));
}
bar(10);
}
foo(2)

  不论实行多少次,都邑alert 16,因为bar能接见foo的参数x,也能接见foo的变量tmp。
  但,这还不是闭包。当你return的是内部function时,就是一个闭包。内部function会close-over外部function的变量直到内部function完毕。

function foo(x) {
var tmp = 3;
return function (y) {
alert(x + y + (++tmp));
}
}
var bar = foo(2); // bar 如今是一个闭包
bar(10);

  上面的剧本终究也会alert 16,因为虽然bar不直接处于foo的内部作用域,但bar照样能接见x和tmp。
  然则,因为tmp仍存在于bar闭包的内部,所以它照样会自加1,而且你每次挪用bar时它都邑自加1.
  (考虑到六岁这个限定:我们实在能够竖立不止一个闭包要领,比方return它们的数组,也能够把它们设置为全局变量。它们全都指向雷同的x和雷同的tmp,而不是各自有一份副本。)
  注:如今来整点儿七岁的内容。
  上面的x是一个字面值(值通报),和JS里其他的字面值一样,当挪用foo时,实参x的值被复制了一份,复制的那一份作为了foo的参数x。
  那末题目来了,JS里处置惩罚object时是用到援用通报的,那末,你挪用foo时通报一个object,foo函数return的闭包也会援用最初谁人object!

function foo(x) {
var tmp = 3;
return function (y) {
alert(x + y + tmp);
x.memb = x.memb ? x.memb + 1 : 1;
alert(x.memb);
}
}
var age = new Number(2);
var bar = foo(age); // bar 如今是一个援用了age的闭包
bar(10);

  不出我们预料,每次运转bar(10),x.memb都邑自加1。但须要注重的是x每次都指向同一个object变量——age,运转两次bar(10)后,age.memb会变成2.
  这和HTML对象的内存走漏有关,呃,不过貌似超出了答题的局限。
  JohnMerlino 对Ali说:
  这里有一个不必return关键字的闭包例子:

function closureExample(objID, text, timedelay) {
setTimeout(function() {
document.getElementById(objID).innerHTML = text;
}, timedelay);
}
closureExample(‘myDiv’, ‘Closure is created’, 500);

  深夜1:37 John Pick如许回复:
  JS里的function能接见它们的:
  1. 参数
  2. 部分变量或函数
  3. 外部变量(环境变量?),包含
3.1 全局变量,包含DOM。
3.2 外部函数的变量或函数。
  假如一个函数接见了它的外部变量,那末它就是一个闭包。
  注重,外部函数不是必须的。经由过程接见外部变量,一个闭包能够保持(keep alive)这些变量。在内部函数和外部函数的例子中,外部函数能够建立部分变量,而且终究退出;然则,假如任何一个或多个内部函数在它退出后却没有退出,那末内部函数就保持了外部函数的部分数据。
  一个典范的例子就是全局变量的运用。
  mykhal如许回复:
  Wikipedia对闭包的定义是如许的:
In computer science, a closure is a function together with a referencing environment for the nonlocal names (free variables) of that function.
  从技术上来说,在JS中,每一个function都是闭包,因为它老是能接见在它外部定义的数据。
  Since scope-defining construction in Javascript is a function, not a code block like in many other languages, what we usually mean by closure in Javascript is a fuction working with nonlocal variables defined in already executed surrounding function.
  闭包常常用于建立含有隐蔽数据的函数(但并不老是如许)。

var db = (function() {
// 建立一个隐蔽的object, 这个object持有一些数据
// 从外部是不能接见这个object的
var data = {};
// 建立一个函数, 这个函数供应一些接见data的数据的要领
return function(key, val) {
if (val === undefined) { return data[key] } // get
else { return data[key] = val } // set
}
// 我们能够挪用这个匿名要领
// 返回这个内部函数,它是一个闭包
})();
db('x'); // 返回 undefined
db('x', 1); // 设置data['x']为1
db('x'); // 返回 1
// 我们不可能接见data这个object自身
// 然则我们能够设置它的成员

  看了这么多外国大牛的解答,不晓得你懂照样不懂,横竖我是懂了。
  P.S. 宣布文章以后看到@xiaotie的一篇文章,以为有必要引荐一下,因为其理会得更加深切。有人说应该在文章末端对闭包举行总结,惋惜小弟才疏学浅,不能给出一个精炼的总结。
  @xiaotie对闭包的总结以下:
(1)闭包是一种设想准绳,它经由过程剖析上下文,来简化用户的挪用,让用户在不晓得的情况下,到达他的目标;
(2)网上主流的对闭包理会的文章实际上是和闭包准绳反向而驰的,假如须要晓得闭包细节才用好的话,这个闭包是设想失利的;
(3)只管少进修。
原文地点:
http://kb.cnblogs.com/page/11…


推荐阅读
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
芝麻开门影视广告
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有