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. 五子棋js

    http://www.jb51.net/article/35993.htm <!DOCTYPE html> <html> <head> <meta http- ...

  2. C# 0-1背包问题

    0-1背包问题 0-1背包问题基本思想: p[i,j]表示在前面i个物品总价值为j时的价值最大值.str[i, j]表示在前面i个物品总价值为j时的价值最大值时的物品重量串. i=0 或者j=0时: ...

  3. Ubuntu(Debian)的aptitude与apt-get的区别和联系

    Ubuntu(Debian)的aptitude与apt-get的区别和联系 aptitude 与 apt-get 一样,是 Debian 及其衍生系统中功能极其强大的包管理工具.与 apt-get 不 ...

  4. 微信小程序 - 表单验证插件WxValidate(自定义警告信息形式)

    弹出的形式对于用户来说,总是不太友好的 可能会出现层级问题(只需要设置一下提示的层级即可) WxValidate内置规则 以下代码拷贝即可使用~ wxml <form bindsubmit='s ...

  5. java 入门-helloWorld

    Java 教程 Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于多个平台,如Windows, Mac OS,及其他多种UNIX版本的系统. ...

  6. 使用Tornado实现Ajax请求

    Ajax,指的是网页异步刷新,一般的实现均为js代码向server发POST请求,然后将收到的结果返回在页面上.   这里我编写一个简单的页面,ajax.html <html> <h ...

  7. iOS-贝塞尔曲线之自定义饼图

    代码地址如下:http://www.demodashi.com/demo/11981.html 项目中需要统计数据展现, 采用了饼图形式展现. 第一步: 了解下贝塞尔曲线相关概念 贝塞尔曲线相关概念: ...

  8. asp.net+mvc+easyui+sqlite 简单用户系统学习之旅(二)—— easyui的简单实用

    下面开始在UserManager.Web中利用easyUI构建web. 1. 先删除自带的controllers.models和views(里面的shared和web.config可以保存)下面的文件 ...

  9. SpringCloud系列十五:使用Hystrix实现容错

    1. 回顾 上文讲解了容错的重要性,以及容错需要实现的功能. 本文来讲解使用Hystrix实现容错. 2. Hystrix简介 Hystrix是Netflix开源的一个延迟和容错库,用于隔离访问远程系 ...

  10. 【Akka】在并发程序中使用Future

    引言 在Akka中, 一个Future是用来获取某个并发操作的结果的数据结构.这个操作一般是由Actor运行或由Dispatcher直接运行的. 这个结果能够以同步(堵塞)或异步(非堵塞)的方式訪问. ...