前几天有人问关于javascript的闭包的问题,这里,首先引用一下《JavaScript权威指南》第6版中第八章第6节的内容,里面讲得非常详细:

和其他大多数现代编程语言一样,JavaScript也采用词法作用域(lexical scoping),也就是说,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的。为了实现这种词法作用域,JavaScript函数对象的内部状态不仅包含函数的代码逻辑,还必须引用当前的作用域链。函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称为“闭包”(这个术语非常古老,是指函数变量可以被隐藏于作用域链之内,因此看起来是函数将变量“包裹”了起来)。

从技术角度讲,所有的JavaScript函数都是闭包:它们都是对象,它们都关联到作用域链。定义大多数函数时的作用域链在调用函数时依然有效,但这并不影响闭包。当调用函数时闭包所指向的作用域链和定义函数时的作用域链不是同一个作用域链时,事情就变得非常微妙。当一个函数嵌套了另外一个函数,外部函数将嵌套的函数对象作为返回值返回的时候往往会发生这种事情。有很多强大的编程技术都利用到了这类嵌套的函数闭包,以至于这种编程模式在JavaScript中非常常见。当你第一次碰到闭包时可能会觉得非常让人费解,一旦你理解掌握了闭包之后,就能非常自如地使用它了,了解这一点至关重要。

理解闭包首先要了解嵌套函数的词法作用域规则。看一下这段代码:

***********************************************************************************

var scope = "global scope";       //全局变量    function checkscope(){            var scope = "local scope";    //局部变量            function f(){return scope;}   //在作用域中返回这个值            return f();    }    console.log(checkscope() );       //==>"local scope"

***********************************************************************************

checkscope()函数声明了一个局部变量,并定义了一个函数f(),函数f()返回了这个变量的值,最后将函数f()的执行结果返回。

现在,我们把以上代码略作改变:

***********************************************************************************

 var scope = "global scope";            //全局变量 function checkscope(){     var scope = "local scope";         //局部变量             function f(){return scope;}        //在作用域中返回这个值           return f;    }    console.log(checkscope()()) ;           //==>"local scope"

***********************************************************************************

在这段代码中,我们将函数内的一对圆括号移动到checkscope()之后。checkscope()现在仅仅返回函数内嵌套的一个函数对象,而不是直接返回结果。在定义函数的作用域外面,调用这个嵌套的函数(包括最后一行代码的最后一对圆括号)会发生什么事情呢?

回想一下词法作用域的基本规则:JavaScript函数的执行用到了作用域链,这个作用域链是函数定义的时候创建的。嵌套在何时何地执行函数f(),这种绑定在执行f()时依然有效。因此最后一行代码返回“local scope”,而不是global scope。简而言之,闭包的这个特性强大到让人吃惊:它们可以捕捉到局部变量和参数),并一直保存下来,看起来像这些变量绑定到了在其中定义它们的外部函数。

待续

转载于:https://blog.51cto.com/muxiangqiangwei/1765319

读书笔记——javascript闭包相关推荐

  1. 昼猫笔记 JavaScript -- 闭包

      本次主要内容是 闭包 阅读时间: 约 3分钟 记得点个赞支持支持我哦 初步了解 先看下代码,输出结果是多少? 1 function fn1 () { 2 var a = 2 3 function ...

  2. 读书笔记----javascript函数编程

    <html><head><meta charset="utf-8"><title>javascript函数编程</title& ...

  3. 读书笔记-JavaScript高级程序设计(1)

    1.组合继承 (JavaScript 中最常用的继承模式 ) (position: page168) (书中定义了两个变量名 SuperType   SubType  乍一看 感觉不太能区分,我将改为 ...

  4. JavaScript权威指南读书笔记——JavaScript的扩展

    常量和局部变量 常量 声明常量需要使用关键字const,const关键爵var关键字行为非常类似,但const声明的是常量. 对常量重新赋值会失败,而对常量重新声明会报错. const pi = 3. ...

  5. 读书笔记-JavaScript面向对象编程(二)

    第5章 原型 5.1 原型属性(所有函数拥有一个prototype属性,默认为空对象) 5.1.1 利用原型添加方法和属性 function Gadget(name,color){this.name= ...

  6. [原]《Web前端开发修炼之道》-读书笔记CSS部分

    如何组织CSS-分层 应用 css 的能力分两部分:一部分是css的API,重点是如何用css控制页面内元素的样式:另一部分是css框架,重点是如何对 css 进行组织.如何组织 css 可以有多种角 ...

  7. 《JavaScript面向对象精要》读书笔记

    JavaScript(ES5)的面向对象精要 标签: JavaScript 面向对象 读书笔记 2016年1月16日-17日两天看完了<JavaScript面向对象精要>(参加异步社区的活 ...

  8. 《javascript面向对象编程指南》读书笔记

    <javascript面向对象编程指南>读书笔记 <javascript面向对象编程指南>读书笔记 第一章 面向对象的JavaScript 第二章 基本数据类型与流程控制 变量 ...

  9. JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记3

    技术非常多,样例非常多.仅仅好慢慢学,慢慢实践!!如今学的这本书是[JavaScript实战----JavaScript.jQuery.HTML5.Node.js实例大全] JavaScript.jQ ...

最新文章

  1. 全球最神秘的9大葡萄园...
  2. 【2018.4.7】模拟赛之四-ssl2385 猜数【水题】
  3. 优秀 Java 程序员写代码的风格
  4. 7-7 印度大壶节 (25 分)
  5. 判断IP是否为搜索引擎蜘蛛或爬虫
  6. [转]在VC中彻底玩转Excel
  7. java中文转英文_Java中文转换为英文拼音
  8. 一点处的导数无法确定单调性
  9. java osm_OSM初识(三)OSM Data
  10. 家用无线路由器购买入门指南
  11. 在家快发霉了?数据告诉你,网友们都怎么打发时间 | DT数说
  12. 对PhD一年级新生有什么建议?
  13. Python3 Flask框架
  14. springmvc 采用MultipartResolver进行文件上传
  15. android应用程序永久获取root权限方法,怎么使Android应用程序获得root权限
  16. Ubuntu系统的备份与恢复
  17. 量子计算机和光计算,杂谈|是量子计算,还是光学实验?
  18. 《地理信息系统导论》chapter10 数据探查习作
  19. HTML中的XMP标签
  20. 微信、支付宝,收款二维码实时生成,自定义金额 备注生成

热门文章

  1. ensp大型网络环境设计与实现_mongodb内核源码设计实现、性能优化、最佳运维系列-网络传输层模块源码实现三...
  2. 查看正在执行的事务_看懂sql_trace--分析执行计划及CBO行为
  3. Java项目:前台+后台在线考试系统设计和实现(java+Springboot+ssm+mysql+jsp+maven)
  4. 实现对学生信息的修改操作
  5. seal report mysql_Seal Report开放数据库报表工具(.Net)
  6. js数组按照下标对象的属性排序
  7. 5 OC 中的三种对象
  8. WCF 第二章 契约
  9. WSS 代码执行的权限提升
  10. Rokid webhook 指南 手把手教你做个懒人