前言:

啊啊啊,看书真的很痛苦啊,还是好想做项目写代码才有意思,不过我现在缺的确是将知识体系化,所以不论看书多么痛苦都一定要坚持坚持啊,这才是我现在最需要的进步的地方,加油!

因为现在期末啦,下周一也就是明天开始就有考试,所以复习是主要的事情,看书的速度比较慢了,一周大概也就184页(P110-P284), 虽然页数比较少但是其中有ES中非常最重要的两个概念——原型链闭包,之前对于两个知识的了解算是知其然不知其所以然的,所以在那两章我也有意多花费了时间,确保我能够吃透这个概念。以下算是我自己的一些理解,如果有不很正确的地方,希望大神们多多指教,康桑阿米达~

哦,对了,我看的JS书是《Javascript 高级程序设计(第3版)》,如果有正在看这本书的小伙伴可以一起哇~大家多多交流,互相学习嘛~

正文:

现在最流行的编程语言里面一定有“对象”的概念,我们的第一节实验课老师就叫我们怎么找对象,所以可见对象对于程序猿的重要性,所以你有对象了嘛?:) 那这世界上对象千千万,我们怎么知道哪个对象合适呢?总不能一个一个的相处试试看吧?好在我们发现很多对象都有相似之处,所以我们将他们相似的部分抽象出来,形成了一个全新的概念,在我们需要的时候,比对我们的需要和这个概念,再进行选择,就会节省我们很多功夫并更好更快的获得我们想要的结果。而这个概念在JS中就是引用类型,Object(JS中没有类的概念,如果学过C++或者Java、C#等语言的,那也会很容易就对应get到JS中引用类型的)。Object确实是JS中非常强大的部分,但却不是最有意思的,那最有意思的是什么?Function。

在JS中,Function也是一个Object的一个对象。而关于这个概念的延伸,像是继承、原型链等等就又可以再开一把了,如果实在是饥渴难耐的,那就快去搜索大神们博客或者找一本《JavaScript高级程序设计》和我一起学习啦~所以,我们现在就将矛头对准,闭包!开火,嘣嘣嘣嘣

在说闭包的概念之前,我们总得知道这个名词到底是什么意思吧?

所以什么是闭包?函数。

既然就是函数为什么又特别要取个名字?它到底特别在哪?

能够访问另一个函数作用域中的变量。(此处的作用域姑且理解为{}之内)

For example,上个例子就知道了,不要问我例子是谁

function outerFunc(arg){

   return function innerFunc(){
alert(arg);
} }

此处名为outerFunc的函数返回了一个名为innerFunc函数,这个函数在内部只有一句“alert(arg);”,可是运用技能一眼看穿法,找不到arg,再往上,哇哦,在outerFunc的参数那找到了呢,真开心。所以这个innerFunc(函数)访问了outerFunc(另一个函数)作用域内(在outerFunc的{}中,但没在innerFunc的{}中)的变量(arg),所以这个innerFunc就是一个闭包。(大多数时候,不会为闭包命名,此处只为更好的说明。)

OK,闭包的概念知道啦,那如何形成闭包这个现象的呢?显然刚刚别有深意,欲拒还迎的作用域使的小把戏啦,别怕,我们立马拿下。

“当某个函数被调用时,会创建一个执行环境及相应的作用域链。”

“每个执行环境都有一个表示变量的对象——变量对象。(variable object)。”

当然还是要先名词解释,要是都不知道这个名词指的什么,那还怎么玩。

作用域:也就是变量对象的别称。

作用域链:就是作用域呗。一条把作用域像腊肉穿起来的子。它只是一条链子所以作用域链就只保存着变量对象的地址,而不是变量对象本身。

执行环境执行环境指向自己独有的作用域链作用域链又按照当前函数作用域,外部函数作用域,外部函数的外部函数作用域....直至全局作用域。

再来了解了解,我们写了个函数然后调用它实现了功能,那JS到底又为此做了什么。
(1)在创建函数时,会创建一个预先包含全局变量对象的作用域链,保存在内部的属性[[scope]]中。
(2)当调用函数时,会为函数创建一个执行环境,然后通过复制函数的[[scope]]属性,构建起执行环境的作用域链。
(3)创建一个活动对象(此处即变量对象)放在执行环境作用域链的最前端。
而当函数在访问一个变量的时候,即在innerFunc函数的执行环境中执行到“alert(arg);”时,执行环境找到自己的作用域链小伙伴,然后作用域链说没问题,我帮你问问我的作用域兄弟们,然后作用域链就问innerFunc()作用域,“你好,请问你有arg这个变量吗?”“不好意思,我没有呢。”“没关系哦。谢谢你。”“不客气。”(老师教导我们要做一个有礼貌的好孩子。)然后它又问outerFunc()作用域,“请问你有arg这个变量吗?”“我有哦。”ok,皆大欢喜,找到了arg,顺利执行了“alert(arg);”语句,否则一直到全局作用域依然没有找到的话,就只能报错了呢。
一般讲,函数执行完毕,那就销毁吧。但是,闭包就这么被销毁了,哪里对得起它特别的名字呢?
 function outerFunc(arg){

    return function innerFunc(){
alert(arg);
} } var result = outerFunc(1); //返回innerFunc函数
result(); //输出1

还是刚才的函数,还是原来的配方,再加点料,看看效果。

按照刚刚说的,outerFunc在第9行执行完毕后,应该就被销毁了(事实上也是如此),但为何第10行的执行依然能够成功呢?聪明的你一定知道啦,作用域和作用域链的关系。outerFunc在第9行执行后,outerFunc的执行环境和作用域链都被销毁,但是!innerFunc的作用域链还在对innerFunc作用域和outerFunc作用域进行引用。也就是所谓了“引用计数不唯一”。所以,尽管outerFunc已经被销毁,但是innerFunc依然能够访问到arg变量的值啦。
所以你看闭包并没有很难嘛,不用怕它,当然我在此说的,都是简单的初级概念,闭包的运用就像是css中的浮动的运用一样,知道概念是很容易的事情,但是真的运用得心应手确实是非常高段位的事了,所以一起加油咯~
 
后话:
明天考试英语,希望能考好啊,我要求不高,上90就行啊。(强行装逼,不必理我)

关于闭包的理解(JS学习小结)的更多相关文章

  1. JS学习小结(上)

    学而时习之,不亦说乎,开启JS学习新乐章~ JS是干啥的?网页特效,它主要是实现控制结构和样式,是一种行为,有多重要,不言而喻吧,页面炫酷的资本. 1. JS输出: alert("hello ...

  2. JavaWeb基础—JS学习小结

    JavaScript是一种运行在浏览器中的解释型的编程语言 推荐:菜鸟教程一.简介js:javascript是基于对象[哪些基本对象呢]和和事件驱动[哪些主要事件呢]的语言,应用在客户端(注意与面向对 ...

  3. React.js学习小结

    最近一段时间都在学习React.js,感觉还不错,现在把自己的一些学习笔记记录一下,留着以后学习查看. 0.React全家桶(技术栈) 1.React主体 2.WebPack:grunt.gulp自动 ...

  4. 【学习笔记】深入理解js原型和闭包(0)——目录

    文章转载:https://www.cnblogs.com/wangfupeng1988/p/4001284.html 说明: 本篇文章一共16篇章,外加两篇后补的和一篇自己后来添加的学习笔记,一共19 ...

  5. 【学习笔记】深入理解js原型和闭包(16)——完结

    之前一共用15篇文章,把javascript的原型和闭包讲解了一下. 首先,javascript本来就“不容易学”.不是说它有多难,而是学习它的人,往往都是在学会了其他语言之后,又学javascrip ...

  6. 【学习笔记】深入理解js闭包

    本文转载: 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接 ...

  7. 【学习笔记】深入理解js原型和闭包系列学习笔记——精华

    深入理解js原型和闭包笔记: 1.“一切皆是对象”,对象是属性的集合. 丨 函数也是对象,但是使用typeof时为什么函数返回function而 丨  不是object呢,js为何要对函数做这样的区分 ...

  8. 【学习笔记】深入理解js原型和闭包(18)——补充:上下文环境和作用域的关系

    本系列用了大量的篇幅讲解了上下文环境和作用域,有些人反映这两个是一回儿事.本文就用一个小例子来说明一下,作用域和上下文环境绝对不是一回事儿. 再说明之前,咱们先用简单的语言来概括一下这两个的区别. 0 ...

  9. 【学习笔记】深入理解js原型和闭包(17)——补this

    本文对<深入理解js原型和闭包(10)——this>一篇进行补充,原文链接:https://www.cnblogs.com/lauzhishuai/p/10078307.html 原文中, ...

随机推荐

  1. Centos中jdk的环境配置

    在Centos中,进行配置jdk的环境,这个还是折腾了我听挺久的.特别是,在一次配置中,导致后来我的root用户无法登录,并且用其他普通用户登录,使用su - root切换到root用户,都无法使用l ...

  2. pentaho cde 画图参数介绍

    初步接触pentaho,由于在国内的资料很少,唯有看英文文档,做了N次反复尝试,挖掘了pentaho CDE中画图的一些基本参数. 下面就列出来了一些常用参数介绍: crosstabMode:表明如果 ...

  3. Sqlite学习笔记(二)&&性能测试

    测试目标 获取SQlite的常规性能指标 测试环境 CPU:8核,Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz 内存:16G 磁盘:SSD Linux 2.6.32 ...

  4. Sql Server之旅——第六站 使用winHex利器加深理解数据页

    这篇我来介绍一个winhex利器,这个工具网上有介绍,用途大着呢,可以用来玩数据修复,恢复删除文件等等....它能够将一个file解析成 hex形式,这样你就可以对hex进行修改,然后你就可以看到修复 ...

  5. Rac grid用户启停监听报错无权限

    [grid@max1 ~]$ lsnrctl stop LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-NOV-2016 00:20: ...

  6. 烂泥:mysql5.5数据库cmake源码编译安装

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 以前也写过一篇有关mysql5.0源码编译的文章,该文章为<烂泥:mysql5.0数据库源码编译安装>.但是MySQL自5.5版本以后,就开 ...

  7. eclipse 提示错误**cannot be resolved to a type

    这是某个对象不能识别为类型,比如你写了个类,名字叫Hello,如果你调用它的时候不小心写成hello,或者helo,那么就会报这样的错误,很容易改正的,只要你细心一点

  8. 从vmware下载到Linux环境下jdk和maven的安装

    写在前面:个人总结,如有不对请指出 操作环境: 操作系统:window7 企业版 处理器:Intel Core i5-4200U CPU @ 1.6GHz 内存:8G 系统类型:64位操作系统 需要安 ...

  9. android开发环境搭建日记和嵌入式Android开发环境初探

    非常感谢博客园的各位,按照你们的博文,还有利用百度和谷歌逐渐建立了android的开发环境,只是给自己备份参考查看,看过的人可以忽略这篇文章. 本文章大部分参考了:http://www.cnblogs ...

  10. 完全变味的Windows Azure Marketplace中国版

    国际版的Microsoft Azure很早就发布Marketplace了,里面有非常丰富的(超过3000款)第三方应用.服务和虚拟机镜像可以购买.其定价模式也非常灵活,支持按需付费(pay as yo ...