优发国际手机版客户端:JavaScript面向对象程序设计(7) 闭包

1.什么是闭包?什么是闭包?一种正式的解释是:所谓闭包,指的是一种拥有很多变量并且绑定了这些变量的情况的表达式(平日是一个函数),因而这些变量也是这个表达式的一部分。信托很多人都不会理解这个定义,由于他的学术味道太浓了或许你爱好从字面的语法长进行阐




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

发表评论
加载中...

相关文章