[读书笔记]JavaScript 闭包(Closures)

1. 什么是闭包?

参考MDN

2. 闭包的使用示例

2.1 示例1

 1     <div>1</div>
 2     <div>2</div>
 3     <div>3</div>
 4     <script>
 5         var nodes = document.getElementsByTagName(‘div‘);
 6         for (var i = 0, len = nodes.length; i < len; i++) {
 7             /* 注意这里 */
 8             (function (i) {
 9
10                 nodes[i].onclick = function () {
11                     console.log(i + 1);
12                 };
13
14             })(i);
15
16         };
17     </script>

2.2 延伸

1 var Type = {};
2 for (var i = 0, type; type = [‘Number‘, ‘String‘, ‘Boolean‘, ‘Array‘, ‘Function‘,
3     ‘RegExp‘, ‘Date‘, ‘Undefined‘, ‘Null‘,‘Error‘][i++];) {
4     (function (type) {
5         Type[‘is‘ + type] = function (obj) {
6             return Object.prototype.toString.call(obj) === ‘[object ‘ + type + ‘]‘;
7         }
8     })(type);
9 };

说明:对于本例来说仅能判断类型,并不能保证类型的合法性,如判断Date如下所示:

1 function isValidDate(d) {
2     if (Object.prototype.toString.call(d) !== "[object Date]") {
3         return false;
4     }
5     return !isNaN(d.getTime());
6 }

3. 闭包的更多作用及示例

3.1 封装变量

在闭包块中实现“私有变量”

 1 var mult = (function () {
 2     var cache = {}, // “制表法”缓存结果集,避免重复的运算
 3         // 封闭calculate 函数
 4         calculate = function () {
 5         var a = 1;
 6         for (var i = 0, l = arguments.length; i < l; i++) {
 7             a = a * arguments[i];
 8         }
 9
10         return a;
11     };
12
13     return function () {
14         var args = Array.prototype.join.call(arguments, ‘,‘);
15         if (args in cache) {
16             return cache[args];
17         }
18
19         return cache[args] = calculate.apply(null, arguments);
20     };
21 })();

MDN的例子用闭包模拟私有方法,也是模块模式的基础。

3.2 延续局部变量的寿命

1 var report = function( src ){
2 var img = new Image();
3 img.src = src;
4 };
5 report( ‘www.xxx.com/stat‘ );

有问题的代码

为了解决函数局部变量在函数执行后立即被销毁的问题,可以用闭包来保存对局部变量的引用以达到延续局部变量生命周期。

 1 var report = (function () {
 2     var imgs = [];
 3
 4     return function (src) {
 5         var img = new Image();
 6         imgs.push(img);
 7         img.src = src;
 8     }
 9 })();
10
11 report(‘www.xxx.com/stat‘);

3.3 闭包和面向对象设计

 1  // 闭包写法
 2  var extent = function () {
 3      var value = 0;
 4      return {
 5          call: function () {
 6              value++;
 7              console.log(value);
 8          }
 9      };
10  };
11  var extent1 = extent(),
12      extent2 = extent();
13  extent1.call(); // 输出:1
14  extent1.call(); // 输出:2
15  extent1.call(); // 输出:3
16
17  extent2.call(); // 输出:1
18
19  var Extent = function () {
20      this.value = 0;
21  };
22
23  // 面向对象的写法
24  Extent.prototype.call = function () {
25      this.value++;
26      console.info(this.value);
27  };
28  var myExtent1 = new Extent();
29  myExtent1.call();
30  myExtent1.call();
31  myExtent1.call();
32
33  var myExtent2 = new Extent();
34  myExtent2.call();

说明:本文代码来自《JavaScript设计模式与开发实践》和网络。

时间: 2024-08-04 23:33:04

[读书笔记]JavaScript 闭包(Closures)的相关文章

JavaScript语言精粹读书笔记- JavaScript对象

JavaScript 对象 除了数字.字符串.布尔值.null.undefined(都不可变)这5种简单类型,其他都是对象. JavaScript中的对象是可变的键控集合(keyed collections). 对象是属性的容器,其中每个属性都拥有名字和值. JavaScript中的对象是无类别的(class-free)的.它对新属性的名字和值没有约束. JavaScript包括一个原型链特性,允许对象继承另一对象的属性. 对象的检索: stooge[“first-name”]或者stooge.

读书笔记----JavaScript 权威指南(一)

0.前言 最近小编我刚刚结束上一段的工作,结果立马就马不停蹄的开始了新一轮的工作了,表示无辜,(o′?ェ?`o),程序猿真是个累死人不偿命的工作呀. 今天晚上看到同事新启封的 JavaScript 权威指南,心血来潮的想,如果我能把这个书里面的重点以及具体知识点梳理出来,那么后来的人是不是就能少走一些弯路呢? 抱着这个想法,于是就开始了今天晚上的读书之旅,更由于小编喜欢整理东西这个习惯,才有了此文. 真心希望看到这篇文章的你,能够感受到小编那深沉的爱!~ 1.JavaScript 语法核心 之

《Javascript高级程序设计》读书笔记之闭包

闭包 function createComparisonFunction(propertyName) { return function (object1, object2) { var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { retu

JavaScript语言精粹读书笔记 - JavaScript函数

JavaScript是披着C族语言外衣的LISP,除了词法上与C族语言相似以外,其他几乎没有相似之处. JavaScript 函数: 函数包含一组语句,他们是JavaScript的基础模块单元,用于代码复用.信息隐藏和组合调用. 函数用于指定对象的行为. 函数对象Functions: 在JavaScript中函数就是对象.对象是"键值"对的集合并拥有一个连接到原型对象的隐藏连接. 对象字面量产生的对象连接到Object.prototype.函数对象连接到Function.prototy

网摘读书笔记----javascript语言精粹

原文链接:http://www.cnblogs.com/Cohlint/archive/2012/11/26/2788790.html 1.6种值会为假(==false),分别是false,null,undefined,' ',0,NaN 2.typeof有6种值,分别是'number','string','boolean','undefined','function','object';其中typeof(null),结果是'object' 3.number类型总是64位浮点数,两个整数相除也可

《JavaScript权威指南》读书笔记——JavaScript核心

前言 这本由David Flanagan著作,并由淘宝前端团队译的<JavaScript权威指南>,也就是我们俗称的“犀牛书”,算是JS界公认的“圣经”了.本书较厚(有1004页),读起来颇费功夫,但作为JavaScript(下文简称:JS)相关从业者,我还是鼎力推荐,一定要读完这本经久不息,好评如潮的JS“圣经”(如果您有耐心的读完,觉得还不错的,博客最后附有购买本书的优惠券,可自行领取). 说完本书重要性,下面重点介绍一下本书作者写书的逻辑性,简单来说本书分为四部分,第一部分:JS核心:第

读书笔记——javascript变量作用域

<JavaScript权威指南>第6版第三章第10节: 一个变量的作用域(scope)是程序源代码中定义这个变量的区域.全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的.然而在函数内声明的变量只在函数体内有定义.它们是局部变量,作用域也是局部的.函数参数也是局部变量,它们只在函数体内有定义.   在函数体内,局部变量的优先级高于同名的全局变量.如果在函数内声明的一个局部变量或函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量所遮盖. var scope = 

读书笔记-JavaScript面向对象编程(一)

PDF下载链接: http://pan.baidu.com/s/1eSDSTVW 密码: 75jr 第1章 引言 1.1 回顾历史 1.2 变革之风 1.3 分析现状 1.4 展望未来 1.5 面向对象的程序设计 1.5.1 对象(属性和方法的集合) 1.5.2 类 (相似对象的共同特征,如麻雀.老鹰都是鸟类) 1.5.3 封装 (将属性和方法集合起来,也有封闭作用域的概念,如封装一个播放器对象) 1.5.4 聚合 (将几个对象合并成一个对象) 1.5.5 继承 (一个实例对象继承父级对象的一些

读书笔记-JavaScript中的全局对象

对于任何JavaScript程序,当程序开始运行时,JavaScript解释器都会初始化一个全局对象以供程序使用.这个JavaScript自身提供的全局对象的功能包括: 1.全局对象拥有一些常用的属性值.比如undefined.Infinity以及NaN.2.全局对象拥有一些常用的属性对象.比如Math.JSON和Number对象均为该全局对象的属性.3.全局对象提供一些全局函数供调用.比如isNaN().isFinite().parseInt()和eval()等.4.全局对象提供一些全局构造器