js中的闭包已经有很多论断了,大家伙有没有听懂了,先引用一片比较高端 的 ”汤姆大叔“  深入理解JavaScript系列(16):闭包(Closures)

好了,为了引起大家的兴趣,先来小诗一首

var funny1 = function(word){
var base = '天上的云啊,';
alert(base + word); return funny1;
}
funny1('真白!')('很白!')('贼白!')('太他妈白!');

论点:所有函数都是闭包,闭包在创建的时候就保存了上下文的作用域链,同一个上下文创建的闭包共用一个作用域链

尼玛,上面的论点看了咋那么虚了,不急,容鄙人娓娓道来

先来解释下到底啥是如此高端的”作用域链“,

每一段js代码(全局代码和函数)都有一个与之关联的作用域链,这个作用域链是一个对象列表或者链表,这组对象定义了这段代码

‘作用域中的变量’,当js需要查找变量x的值得时候(变量解析),它会从链的第一个对象开始查找,如果这个对象有个一个名为x的属性,则直接使用这个属性的值,如果不存在x属性,js会查找链上的下一个对象,如果仍然没有则继续下一个对象,以此类推。如果该链上没有任何一个对象用于x属性,那么就认为该段代码作用域链上不存在x,最终抛出一个引用异常错误

以上说法应该了解了吧,如果不了解,不要紧,请持续关注鄙人的博客,到时鄙人会专门写篇文章论述这个玩意

先来看一个经典的关于闭包的现象

var funcs = [];
for(var i =1; i <= 5; i++){
funcs[i] = function(){alert(i);}
}
funcs[5]();

这个结果是弹出”6“,当然你即便使用"funcs[1]()"还是弹出"6", 我们尝试使用上面的理论来解释这一现象。

这里会产生5个函数,即 funcs[1]...funcs[5], 这些函数在定义时都会定义一个作用域链,由于他们的作用域链是相同的(记得上面的理论吗"同一个上下文创建的闭包共用一个作用域链"),这个链上有'i'这个属性,当然了这个作用域链的属性是一个引用而非拷贝,因此每次循环将会改变'i'的值,直至循环5次后,又将'i'加了1,最终变为了6, 由于作用域链中的属性'i'引用了变量'i',所以作用域链对象中的属性'i'最终都变为6,那么每个函数在执行时都会去查找作用域链中的'i'属性,都是6.

再来看一个例子,十分有趣啊,似乎记住了自己的过去

var z = 10;
var lizi = function(){
alert(z);
}
;(function(){
var z = 20;
lizi();
})();

你是不是以为会弹出"20", 如此的话恭喜你中标了,结果是"10"。看起来好像记住了过去似得,十分诡异。

我们尝试使用上的逻辑来解释这一现象,首先函数'lizi'在全局代码中创建的,想想上面的理论("闭包在创建的时候就保存了上下文的作用域链"),'lizi'在创建时就保存了自己的作用域链,该链上有属性'z',值为'10'。后面在匿名函数中又声明了变量'z' 且赋值20, 但是匿名函数和前面的全局代码上下文是不一样的, 所以他们的作用域链也是不同的,匿名函数中不仅有global的作用域链,还有匿名函数本身的作用域链(该链在global链上增加了一些东西),不过这两个链中都有属性'z'。在匿名函数中调用'lizi' ,'lizi'会到自己在定义时保存的作用域链上查找'z' 发现'z'的值为10. 该处如果全局代码中没有定义'z', 你即便在匿名函数中定义了'z', 'lizi'中仍然会弹出未定义,不信,有如下代码为证

var lizi = function(){
alert(z);
} ;(function(){
var z = 20;
lizi();
})();

上面一段代码,要是不报错,请骂我!!!

再来一段代码,自己按照上面的理论去解释,然后猜,到底是啥

var one;
var two;
var three = function(){
var x = 1;
one = function(){
return ++x;
}
two = function(){
return --x;
} alert(one());
} three();
alert(one());
alert(two());

自此,闭包产生的原因和导致的结果算是讲完了

尼玛,说了这么多,这个闭包放在这里难道故意装逼为难我们,到底在实践中有啥用了?

先弄个面向对象中高大上的用法,"私有变量" , 私有变量自然只能是内部可以更改访问,外部就不行了

var conuter = function(){
var count = 0;
return {
'count':function(){return count++;},
'reset':function(){count = 0},
'get':function(){return count;}
};
} var c = conuter();
alert(c.get());
c.count();
alert(c.get());

怎么样,是不是有写'java','php'之流的感觉

好了,鄙人才疏学浅,如有不足,欢迎补足!

javascript中的闭包,超简单论述,保证小学生必懂的更多相关文章

  1. 让你分分钟学会Javascript中的闭包

    Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...

  2. JavaScript中的闭包理解

    原创文章,转载请注明:JavaScript中的闭包理解  By Lucio.Yang 1.JavaScript闭包 在小学期开发项目的时候,用node.js开发了服务器,过程中遇到了node.js的第 ...

  3. Javascript中的闭包(转载)

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

  4. 狗日的Javascript中的闭包

    前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.下面是作者从作用域链慢慢讲到 ...

  5. 前端面试之JavaScript中的闭包!

    前端面试之JavaScript中的闭包! 闭包 闭包( closure )指有权访问另一个函数作用域中变量的函数. ----- JavaScript 高级程序设计 闭包其实可以理解为是一个函数 简单理 ...

  6. 难道这就是JavaScript中的"闭包"

    其实对于JavaScript中的"闭包"还没真正理解,这次在实际Coding中似乎遇到了"闭包"的问题,仅此摘录,以待深究. 表现为jQuery的post方法回 ...

  7. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  8. javascript中的闭包解析

    学习javaScript已经有一段时间了,在这段时间里,已经感受到了JavaScript的种种魅力,这是一门神奇的语言,同时也是一门正在逐步完善的语言,相信在大家的逐步修改中,这门语言会逐步的完善下去 ...

  9. 【JS】JavaScript中的闭包

    在JavaScript中,闭包指的是有权访问另一个函数作用域中的变量的函数:创建闭包最常见的方式就是在一个函数内创建另一个函数.如下例子: function A(propertyName){ retu ...

随机推荐

  1. Java解决题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子。。。

    题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子,假如兔子都不死,问M个月时兔子的数量,M为键盘读入的正整数.(请用Java语言作答) 样例输入: 3 样 ...

  2. Linux 学习之DNS服务器

    概念: DNS:Domain Name System 域名系统 FQDN:Fully Qualified Domain Name 完整主机名 正向解析:由主机名查IP地址 SOA:开始验证(Start ...

  3. 基于51单片机+DAC0832的信号发生器

    最近帮别人设计一个毕业设计,做一个多种信号发生器(四种波形:方波.三角波.锯齿波.梯形波),现在贴上来给大家参考,如果有错误的地方,望指出~ 下面先贴上仿真的电路图(仿真的软件是Protuse,上传一 ...

  4. OpenStack在线迁移

    OpenStack迁移需要将虚拟机创建运行在共享存储上才可以进行迁移. 一.配置共享存储 1.环境 OpenStack三个节点icehouse-gre模式部署一文部署了的OpenStack环境. IP ...

  5. 用命令测试安装好的OpenStack环境

    OpenStack三个节点icehouse-gre模式部署一文部署了一套OpenStack环境,接下来使用命令测试一遍. 首先要明确几个概念: 外网:可分配floating ip绑定到虚拟机,外部就可 ...

  6. J2EE笔记2

    1. 部署并启动 tomcat 服务器.1). 解压 apache-tomcat-6.0.16.zip 到一个非中文目录下2). 配置一个环境变量. java_home(指向 JDK 安装的根目录) ...

  7. 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)

    Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...

  8. Codeforces Round 261 Div.2 D Pashmak and Parmida's problem --树状数组

    题意:给出数组A,定义f(l,r,x)为A[]的下标l到r之间,等于x的元素数.i和j符合f(1,i,a[i])>f(j,n,a[j]),求有多少对这样的(i,j). 解法:分别从左到右,由右到 ...

  9. UVALive 6470 Chomp --记忆化搜索

    题意:给一个只有三行的方块阵(横向最多100个),然后p,q,r分别代表第1,2,3层的方格数,两人轮流去掉一个格子,此时这个格子的右上方都会被去掉,面临只剩最左下角的一个格子的状态的人输,问先手能否 ...

  10. kvm虚拟化管理平台WebVirtMgr部署-完整记录(安装Windows虚拟机)-(4)

    一.背景说明  在之前的篇章中,提到在webvirtmgr里安装linux系统的vm,下面说下安装windows系统虚拟机的操作记录: 由于KVM管理虚拟机的硬盘和网卡需要virtio驱动,linux ...