本节书摘来华章计算机出版社《JavaScript应用程序设计》一书中的第2章,第2.8节,作者:Eric Elliott 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.8 闭包

闭包是一项在应用开发过程中非常实用的技术。
简单来说,闭包会保存函数作用域中的状态,即使这个函数已经执行完毕。创建闭包很简单,只需在一个函数体中再定义一个内部函数,接着将这个内部函数直接返回或者传递给另一个函数即可。这个内部函数可以访问所有在其外部函数作用域中定义的变量,闭包的这种特性常常被用来做数据的访问控制。
由于在外部函数定义的变量仅存在于内部函数的作用域上,所以你只能通过一个特权方法来访问这些数据。在其他语言中,特权方法通常是一个可以访问私有数据的暴露方法,而在JavaScript中,任何具有闭包作用域的方法都具有特权性质。

var o = function o () {var data = 1,get;get = function get() {return data;};return {get: get};
};test('Closure for object privacy.', function () {var obj = o(); // Get an object with the .get() method.try {ok(data, 'This throws an error.');} catch (e) {ok(true,'The data var is only available'+ ' to privileged methods.');}equal(obj.get(), 1,'.get() should have access to the closure.');
});

在上述示例中,o是一个对象工厂,它定义了私有变量data与一个用于访问data的特权方法get(),紧接着向外界返回了一个包含了get()方法的对象字面量。
在测试用例中,先将o的返回值赋给obj,随后在try作用块中尝试直接访问私有变量data,此时会抛出异常,因为data在其函数闭包作用域外是未定义的。
除了可以对数据进行访问控制外,闭包使得lambda可以直接访问外层作用域上的变量,函数之所以被视为JavaScript的“一等公民”,正是得益于闭包强大的特性。
闭包为事件监听器或回调函数提供数据,这些函数通常是在其外层函数执行完成后,才被调用,例如:

(function () {var arr = [],count = 1,delay = 20,timer,complete;timer = function timer() {setTimeout(function inner() {arr.push(count);if (count < 3) {count += 1;timer();} else {complete();}}, delay);};asyncTest('Closure with setTimeout.', function () {complete = function complete() {equal(arr.join(','), '1,2,3','arr should be [1,2,3]');start();};timer();equal(arr.length, 0,'array should be empty until the first timout.');});
}());

在上述示例中,inner()这个lambda可以访问到arr、complete()以及count这些外部函数中定义的变量。它在每次被调用时,将当前count值添加至arr数组中,如果arr中的值数量不满3个,则触发call方法启动一个定时器,随后在定时器中inner()再次被调用。
这是一个异步递归调用的例子,这种模式经常用来做ajax请求失败后的重连操作,不过,需要设置超时次数与重连间隔,不然服务器会被数以万计的用户请求所拉垮。
asyncTest()方法是QUnit测试框架提供的一个进行异步测试的快捷函数。一般来说,你可以在测试用例的开始处调用stop()方法告诉QUnit你希望用断言来触发异步操作。Stop()方法会在start()方法完成调用后结束测试用例。
当用例执行时,complete()函数被定义,紧接着它在inner函数中被调用。complete函数中包含了对arr中内容验证的equal()断言方法。
如你所见,上述代码中最后一个equal()断言方法首先被程序执行。这是因为第一个定时器中的内容需要等到其超时完成后才会被执行,在定时器中的内容被执行之前,访问arr或者count会返回变量的初始值。
每回inner()被调用时,count递增随后被添加至arr数组中。 因为count与arr都被定义在一个闭包作用域中,所以在此作用域中的函数均可以对其进行访问,这便是为什么它们可以在asyncTest测试函数中被使用的缘故。

《JavaScript应用程序设计》一一2.8 闭包相关推荐

  1. 《JavaScript应用程序设计》一一2.3 lambdas

    本节书摘来华章计算机出版社<JavaScript应用程序设计>一书中的第2章,第2.3节,作者:Eric Elliott 更多章节内容可以访问云栖社区"异步社区"公众号 ...

  2. 《JavaScript应用程序设计》一一3.2 流式JavaScript

    本节书摘来华章计算机出版社<JavaScript应用程序设计>一书中的第3章,第3.2节,作者:Eric Elliott 更多章节内容可以访问云栖社区"华章计算机"公众 ...

  3. 《JavaScript应用程序设计》一一2.17 回调函数

    本节书摘来华章计算机出版社<JavaScript应用程序设计>一书中的第2章,第2.17节,作者:Eric Elliott 更多章节内容可以访问云栖社区"华章计算机"公 ...

  4. 《JavaScript应用程序设计》一一3.1 过时的类继承

    本节书摘来华章计算机出版社<JavaScript应用程序设计>一书中的第3章,第3.1节,作者:Eric Elliott 更多章节内容可以访问云栖社区"华章计算机"公众 ...

  5. 前端红宝书《JavaScript高级程序设计》核心知识总结

    此文是对<JavaScript 高级程序设计>一书难点的总结,也是笔者在看了 3 遍之后的一些梳理和感想,希望能借此巩固js的基础和对一些核心概念有更深入的了解. 摘要 JS基本的数据类型 ...

  6. 《JavaScript高级程序设计(第3版)》教程大纲

    词条 <JavaScript高级程序设计>是2006年人民邮电出版社出版的图书,作者是(美)(Nicholas C.Zakas)扎卡斯.本书适合有一定编程经验的开发人员阅读,也可作为高校相 ...

  7. 《JavaScript高级程序设计》(第2版)上市

      本书是技术畅销书<JavaScript高级程序设计> 的第2版,几乎全部更新.重写 了上一版的内容,融入了作者近几年来奋战在前端开发一线的宝贵经验 , 是学习和提高JavaScript ...

  8. 《javascript高级程序设计》笔记:内存与执行环境

    上一篇:<javascript高级程序设计>笔记:继承 近几篇博客都会围绕着图中的知识点展开 由于javascript是一门具有自动垃圾收集机制的编程语言,开发者不必担心内存的分配和回收的 ...

  9. javascript高级程序设计pdf_一个老牌程序员推荐的JavaScript的书籍,看了真的不后悔!...

    很多人问我怎么学前端?我的回答是:读书吧!相对于在网上学习,在项目中学习和跟着有经验的同事学习,书中有着相对完整的知识体系,每读一本好书都会带来一次全面的提高.而如果深一脚浅一脚的学习,写出代码的质量 ...

最新文章

  1. 印度小哥“神剑”:PDF提取表格so easy!
  2. 边缘计算架构_边缘计算到底是个什么技术?边缘计算硬件架构
  3. Android 图形系统
  4. Tomcat集群session复制与Oracle的坑
  5. 免费的编程中文书籍索引(2018第三版)
  6. 一个http请求完整过程的个人理解
  7. c语言删标点,C程序中文标点惹的祸,你可长点儿心吧
  8. splay详解(三)
  9. Stanford机器学习---第八讲. 支持向量机SVM
  10. Android源码kernel编译
  11. 获取winform应用程序集信息
  12. Kepware IOT Gateway Rest server
  13. Javasocket编程步骤,已有千人收藏
  14. via浏览器如何拦截广告
  15. Outlook读取奇妙清单Wunderlist日历失败的解决办法
  16. CAD几何引擎和图形引擎的关系
  17. mysql中数据处理小技巧
  18. setuid函数解析
  19. 【客户是瞎子】腾讯微博注册的不友好提示
  20. 【阿贝云】免费的云服务器,真香

热门文章

  1. 01-利用思维导图梳理JavaSE-Java语言基础
  2. 鸟哥的linux私房菜-文件压缩于打包-2
  3. MySQL 性能优化技巧
  4. RIS实现系统的远程安装之三使用远程安装
  5. 计算机网络玩家需要掌握的八个DOS命令
  6. mybatis 配置_MyBatis教程3:优化MyBatis配置文件中的配置
  7. Tungsten Fabric SDN — Service Chain — Basic Service Chain and Policy-Based Steering
  8. Tungsten Fabric SDN — 零宕机(ZIU)自动化运维
  9. 5G NGC — AUSF 鉴权服务功能
  10. Redis M/S + Keepalived 主从备份高可用