WEB开发网
开发学院网页设计JavaScript JavaScript面向对象程序设计(7): 闭包 阅读

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

 2009-09-11 00:00:00 来源:WEB开发网   
核心提示:1. 什么是闭包?什么是闭包?一种正式的解释是:所谓闭包,指的是一种拥有很多变量并且绑定了这些变量的环境的表达式(通常是一个函数),JavaScript面向对象程序设计(7): 闭包,因而这些变量也是这个表达式的一部分,相信很多人都不会理解这个定义,Java社区中的部分成员一直对闭包梦寐以求,C#也已经在最新版本中添加

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表达式。

出处: http://devbean.blog.51cto.com/448512/174927

编缉推荐阅读以下文章

  • JavaScript面向对象程序设计(8): 优雅的封装还是执行的效率?
  • JavaScript面向对象程序设计(6): 封装
  • JavaScript面向对象程序设计(5): 类
  • JavaScript面向对象程序设计(4): 函数
  • JavaScript面向对象程序设计(3): 对象
  • JavaScript面向对象程序设计(2): 数组
  • JavaScript面向对象程序设计(1): 前言
  • 理解JavaScript面向对象的思路
  • Javascript面向对象详解(第一部分)
  • JavaScript面向对象的支持(下)

Tags:JavaScript 面向 对象

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接