`
忘忧鸟
  • 浏览: 141752 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

【转】JavaScript面向对象程序设计(7): 闭包

阅读更多

闭包这个概念看上去很深奥,这个词在离散数学里面的意思确实比较难于理解。在这里,我们先可以把闭包理解成是一种匿名函数或者匿名类。
1. 什么是闭包?

什么是闭包?一种正式的解释是:所谓闭包,指的是一种拥有很多变量并且绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是这个表达式的一部分。

相信很多人都不会理解这个定义,因为他的学术味道太浓了——或许你喜欢从字面的语法上进行分析:首先,它是一个表达式,这个表达式绑定了很多变量以及这些变量的环境。不过这并没有什么意义,这依然不会告诉我们什么是闭包。

那么,来看一个例子:

function add(a) { 
 return function(b) { 
 return a + b; 
 }; 
} 
var func = add(10); 
alert(func(20)); 
 
我想经过了前面有关函数的描述,这个例子应该很清楚的理解。JavaScript里面的函数就是对象,他可以做对象能做的一切事情——我们首先定义了一个函数add,它接受一个参数,这个函数返回一个匿名函数,这个匿名函数也接受一个参数,并且会返回这个参数同外部函数的那个参数的和。因此在我们使用的时候,我们将add返回的匿名函数赋值给func,然后调用func,就返回了这两个数的和。

当我们创建一个这样的函数,这个函数内部的一个变量能够在函数外面被引用时,我们就称创建了一个闭包。仔细的品味一下:这就是那个闭包的定义。

看看我们的代码:首先,它有一个内部变量,就是那个匿名函数;其次,这个函数将匿名函数返回了出去,以便外面的变量可以引用到内部定义的变量。

2. 闭包的作用

闭包有什么用呢?或许现在还看不出来,那么看看这段代码:
function inc(a) { 
 var i = 0; 
 return function() { 
 return i; 
 }; 
} 
var num = inc(); 
alert(num()); 
 
本来,这个变量 i 在函数外面是访问不到的,因为它是 var 定义的,一旦跳出作用域,这个变量就被垃圾回收了,但是,由于我们使用了闭包,在外面是能够访问到这个变量的,因此它并不被垃圾回收!

如果还是不明白闭包的作用,那么看一段应该很熟悉的代码:
function Person() { 
 var id; 
 this.getId = function() { 
 return id; 
 } 
 this.setId = function(newId) { 
 id = newId; 
 } 
} 
var p = new Person(); 
p.setId(1000); 
alert(p.getId()); // 1000 
alert(p.id); // undefined 
 
我们定义一个类Person,它有一个id属性。现在这个属性的行为很像是私有变量——只能通过 setter 和 getter 函数访问到。没错,这就是闭包的一个用途:制造类的私有变量!

闭包还有一个作用:在内存中维护一个变量,不让垃圾回收器回收这个变量。这里的例子就不再举出了。

这里我们只是简单的说了JavaScript的闭包的概念,并没有涉及闭包的内存模型等等之类。这是一个相当重要的概念,Java社区中的部分成员一直对闭包梦寐以求,C#也已经在最新版本中添加了闭包的概念,只不过在那里称为lambda表达式。
分享到:
评论

相关推荐

    JavaScript面向对象程序设计

    JavaScript面向对象程序设计(1): 前言 JavaScript面向对象程序设计(2): 数组 JavaScript面向对象程序设计(3): 对象...JavaScript面向对象程序设计(7): 闭包 JavaScript面向对象程序设计(8): 优雅的封装还是执行的效率?

    JavaScript面向对象编程指南

    《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的..., 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库。

    JavaScript面向对象编程指南.pdf

    JavaScript作为一门浏览器语言的核心思想;面向对象编程的基础知识及其在... 《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库

    JavaScript面向对象编程指南 英文版

    《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的...《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库。

    JavaScript面向对象编程指南 有书签

    《JavaScript面向对象编程指南》内容包括:JavaScript作为一门浏览器语言的...《JavaScript面向对象编程指南》着重介绍JavaScript在面向对象方面的特性,展示如何构建强健的、可维护的、功能强大的应用程序及程序库。

    javascript DOM 编程艺术

    从颇具深度的JavaScript语言基础到作用域(链),从引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(BOM)、文档对象模型(DOM)到基于事件的Web脚本设计,从XML(E4X)到Ajax及JSON,从...

    Javascript 高级编程第2版PDF part1

    从颇具深度的javascript语言基础到作用域(链),从引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(bom)、文档对象模型(dom)到基于事件的web脚本设计,从xml(fax)到ajax及json,从...

    Javascript 高级编程第2版PDF part5

    从颇具深度的javascript语言基础到作用域(链),从引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(bom)、文档对象模型(dom)到基于事件的web脚本设计,从xml(fax)到ajax及json,从...

    Javascript 高级编程第2版PDF part4

    从颇具深度的javascript语言基础到作用域(链),从引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(bom)、文档对象模型(dom)到基于事件的web脚本设计,从xml(fax)到ajax及json,从...

    Javascript 高级编程第2版PDF part3

    从颇具深度的javascript语言基础到作用域(链),从引用类型到面向对象编程,从极其灵活的匿名函数到闭包的内部机制,从浏览器对象模型(bom)、文档对象模型(dom)到基于事件的web脚本设计,从xml(fax)到ajax及json,从...

    JavaScript王者归来part.1 总数2

     7.5 JavaScript的内置对象   7.5.1 Math对象   7.5.2 Date对象--创建一个简单的日历   7.5.3 Error对象   7.5.4 其他内置对象   7.5.5 特殊的对象--全局对象与调用对象   7.6 总结   第8章 集合  ...

    Curso-JS-para-desarrolladores-web_ed3:FICTIZIA»面向Web开发人员JavaScript课程-第三版

    #适用于Web开发人员JavaScript ### JavaScript...基本概念对象职能变数特性遗产混合蛋白闭包语境命名空间大事记HTTP请求JSON,JSONP 错误处理代码优化面向对象的程序设计样机建设者hasOwnProperty,porpertyIsEnumer

    COURSERA_HTML_CSS_Javascript_Web_Developers:Web开发人员HTML,CSS和Javascript

    Coursera 约翰·霍普金斯大学 欢迎使用面向Web开发人员HTML,... Javascript中的对象和函数 数组,闭包和命名空间 使用Java脚本构建Web应用程序 文档对象模型操纵 Ajax简介 使用Ajax将餐厅网站与真实数据连接起来

    达内java培训目录

    Java面向对象 面向对象特性:封装、继承、多态等,面向对象程序设计,基础设计模式等。 掌握面向对象的基本原则以及在编程实践中的意义;掌握Java面向对象编程基本实现原理。 实训项目一:Tetris项目开发 第二阶段...

    javascript事件模型代码

    本节稍稍深入地讨论关于事件处理的话题,如果你对模式、闭包和面向对象等概念还不太理解,不妨暂且等阅读完相关内容之后再回过头来阅读它,相信你会有很大收获。 1 事件处理模式 在程序设计领域,“事件处理”是一...

    Curso-JS-para-desarrolladores-web_ed2:FICTIZIA»面向Web开发人员JavaScript课程-第二版

    面向对象的程序设计 样机 建设者 hasOwnProperty,porpertyIsEnumerable 致电申请 功能编程 模块化 回呼 事件驱动设计 JavaScript设计模式 建设者 模组 辛格尔顿 MVC 依赖注入 Backbone.js 单页应用 楷模 观看...

    course-node-express-react:使用Node.js + Express.js + React.js进行全栈应用程序开发

    使用Node.js + Express.js + React.js进行全栈应用开发Webpack和Babel介绍了面向对象JavaScript,事件驱动的编程,闭包和回调,立即调用的函数表达式(IIFE),设计模式,jQuery,ECMAScript 6,Promises和Lambdas等...

Global site tag (gtag.js) - Google Analytics