《javascript设计模式》学习笔记二:闭包

发布于,归属于javascript ,javascript教程沙发还空着,抢! 共有223人围观    

在javascript中,函数就是对象,而且是一等对象,它拥有其他语言函数的所有特性,同时也拥有其他语言不可比拟的灵活性,在笔记一中无论是哪一种创建对象的方法,它们的构造函数都是函数。

现在来看个javascript独有的特性:闭包。

关于闭包,有一篇非常专业的文章,附上网址:

www.cn-cuckoo.com/2007/08/01/understand-javascript-closures-72.html

里面关于闭包的解释是这样的:

所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

在《javascript设计模式》关于闭包的解释是这样的:

闭包是一个受保护的变量空间,由内嵌的函数构成。定义在函数内部的变量在函数外部不可以被访问。通过将变量包裹在匿名函数中,从而创建类的私有变量。

不管哪种定义,都非常抽象,来看例子:

闭包与匿名函数息息相关,来看个匿名函数的例子:

(匿名函数顾名思义就是没有函数名的函数:function(){…….},例子里面的函数后面有个(),实际上是立即调用的意思,这个()实际上在用来传递匿名函数参数的容器,再来看个例子).

(function(foo,bar){
alert(foo*bar);
})(5,6);

例子中的(5,6)实际上是匿名函数的实参。

再看个与上一个例子类似的写法:

var baz = (function(foo,bar){
return foo*bar;
})(5,6);
alert(baz);

这个例子将匿名函数赋予一个变量。

匿名函数的关键用途:创建闭包!再看个例子:

  1. var baz;
  2. (function(){
  3.     var foo = 10;
  4. var bar = 2;
  5. baz = function(){
  6.       return foo * bar;
  7. };
  8.  
  9. })();
  10. alert(baz());

代码解释:

运行以上函数后,弹出对话框显示的是20,这是闭包的有意思的地方,本来定义在函数内部的变量是无法访问的,比如foo 和bar,但是在函数里面将一个匿名函数赋予一个全局变量时,此匿名函数可以使用局部变量。比如: baz是全局变量,但是它与foo、bar一样存在于匿名函数中,它的值是function(){return foo * bar;};这个匿名函数返回来的foo * bar的值,当我们在函数外使用alert()就可以访问到闭包中的变量。

之所以强调闭包,在于javascript并没有命名空间与私有共有的定义,但利用闭包可以实现类似的功能,这在保护变量的时候很有用。

(如果您喜欢这篇教程,可以通过支付宝打赏我们1元哦,拜谢!)

跟作者说两句

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-? :) :( :!: 8-O 8)