1. 什么是闭包?

参考MDN

2. 闭包的使用示例

2.1 示例1

     <div>1</div>
<div>2</div>
<div>3</div>
<script>
var nodes = document.getElementsByTagName('div');
for (var i = 0, len = nodes.length; i < len; i++) {
/* 注意这里 */
(function (i) { nodes[i].onclick = function () {
console.log(i + 1);
}; })(i); };
</script>

2.2 延伸

 var Type = {};
for (var i = 0, type; type = ['Number', 'String', 'Boolean', 'Array', 'Function',
'RegExp', 'Date', 'Undefined', 'Null','Error'][i++];) {
(function (type) {
Type['is' + type] = function (obj) {
return Object.prototype.toString.call(obj) === '[object ' + type + ']';
}
})(type);
};

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

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

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

3.1 封装变量

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

 var mult = (function () {
var cache = {}, // “制表法”缓存结果集,避免重复的运算
// 封闭calculate 函数
calculate = function () {
var a = 1;
for (var i = 0, l = arguments.length; i < l; i++) {
a = a * arguments[i];
} return a;
}; return function () {
var args = Array.prototype.join.call(arguments, ',');
if (args in cache) {
return cache[args];
} return cache[args] = calculate.apply(null, arguments);
};
})();

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

3.2 延续局部变量的寿命

 var report = function( src ){
var img = new Image();
img.src = src;
};
report( 'www.xxx.com/stat' );

有问题的代码

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

 var report = (function () {
var imgs = []; return function (src) {
var img = new Image();
imgs.push(img);
img.src = src;
}
})(); report('www.xxx.com/stat');

3.3 闭包和面向对象设计

  // 闭包写法
var extent = function () {
var value = 0;
return {
call: function () {
value++;
console.log(value);
}
};
};
var extent1 = extent(),
extent2 = extent();
extent1.call(); // 输出:1
extent1.call(); // 输出:2
extent1.call(); // 输出:3 extent2.call(); // 输出:1 var Extent = function () {
this.value = 0;
}; // 面向对象的写法
Extent.prototype.call = function () {
this.value++;
console.info(this.value);
};
var myExtent1 = new Extent();
myExtent1.call();
myExtent1.call();
myExtent1.call(); var myExtent2 = new Extent();
myExtent2.call();

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

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

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

    闭包 function createComparisonFunction(propertyName) { return function (object1, object2) { var value1 ...

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

    PDF下载链接: http://pan.baidu.com/s/1eSDSTVW 密码: 75jr 第1章 引言 1.1 回顾历史 1.2 变革之风 1.3 分析现状 1.4 展望未来 1.5 面向对 ...

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

    JavaScript是披着C族语言外衣的LISP,除了词法上与C族语言相似以外,其他几乎没有相似之处. JavaScript 函数: 函数包含一组语句,他们是JavaScript的基础模块单元,用于代 ...

  4. [读书笔记]javascript语言精粹'

    人比较笨,以前只做项目,案例,然而一些javascript的很多理论不知道该怎么描述,所以最近开启一波读书之旅: 标识符 1.定义 标识符以字母开头,可能后面跟上一个或多个字母.数字或者下划线. 2. ...

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

    第7章 浏览器环境 7.1 在HTML页面中引入JavaScript代码 7.2概述BOM与DOM(页面以外事物对象和当前页面对象) 7.3 BOM 7.3.1 window对象再探(所以JavaSc ...

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

    前言 这本由David Flanagan著作,并由淘宝前端团队译的<JavaScript权威指南>,也就是我们俗称的“犀牛书”,算是JS界公认的“圣经”了.本书较厚(有1004页),读起来 ...

  7. 昼猫笔记 JavaScript -- 闭包

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

  8. 读书笔记-----javascript基本数据类型

    由于js基础差, 记性也不好,准备一边读书一边做记录,希望这样能加深一下记忆 /*   第一天     */ javascript 基本数据类型 js一共只有五种数据类型 Undefined,  Nu ...

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

    对于任何JavaScript程序,当程序开始运行时,JavaScript解释器都会初始化一个全局对象以供程序使用.这个JavaScript自身提供的全局对象的功能包括: 1.全局对象拥有一些常用的属性 ...

随机推荐

  1. 2017.10.25 es-sql分页无效

    1.问题描述 使用es-sql聚合查询时,发现无法进行分页操作. 结果为16条: 当使用limit语法进行分页之后,发现并没有效果(以取5条记录为一页为例). 首先查询前5条记录: 返回的记录如下图: ...

  2. APK大小的瘦身的总结:

    首先是看了博客:http://blog.csdn.net/sw950729/article/details/64919051 时.认为大神我就是马云飞写的非常有道理.全部自己就自己写了一遍.长话短说: ...

  3. Java Volatile keyword

    Volatile修饰的成员变量在每次被线程訪问时,都强迫从主内存中重读该成员变量的值.并且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在不论什么时刻,两个不同的线程总是看到某个成员变量的 ...

  4. Android 之UI自适应解决方式

    1.概况 作为Android开发者,最头疼的莫过于让自己开发的程序在不同终端上面的显示效果看起来尽量一致(当然.假设要充分利用大屏幕的优势另当别论).在全球范围内来讲.android有着数以亿计的设备 ...

  5. javascript 捕获异常方法

    捕获异常的实例: var str="fasdfsadfsad$$异常信息$$你看不到我"; var arr=str.split("$$"); arr[1]; 通 ...

  6. Python实时语音识别控制

    代码地址如下:http://www.demodashi.com/demo/12946.html Python实时语音识别控制 概述 本文中的语音识别功能采用 百度语音识别库 ,首先利用 PyAudio ...

  7. 【Nginx】核心模块ngx_events_module

    核心模块ngx_events_module是一个专门用于管理事件模块的模块. 它的实现非常easy.以下是该模块的定义: ngx_module_t ngx_events_module = { NGX_ ...

  8. 使用 Google 高级搜索的一些技巧

      一,GOOGLE简介 Google(www.google.com)是一个搜索引擎,由两个斯坦福大学博士生Larry Page与Sergey Brin于1998年9月发明,Google Inc. 于 ...

  9. atitit.复合变量,也就是类似$$a的变量的原理与实现 java c#.net php js

    atitit.复合变量,也就是类似$$a的变量的原理与实现 java c#.net php js 1.1. 复合变量,也就是类似$$a的变量,它会进行两次的解释. 1 1.2. 数据库里面的复合变量1 ...

  10. Django学习之模板标签和变量

    safe过滤器和{% autoescape %}标签 首先看这样一个例子: views.py中: c = '<h3>更上一层楼</h3>' render(request,'te ...