WEB开发网
开发学院网页设计JavaScript JavaScript 中的函数式编程实践 阅读

JavaScript 中的函数式编程实践

 2010-06-23 00:00:00 来源:WEB开发网   
核心提示: 清单 8. 一个闭包的例子functionoutter(){varn=0;returnfunction(){returnn++;}}varo1=outter();o1();//n==0o1();//n==1o1();//n==2varo2=outter();o2();//n==0o2();//n

清单 8. 一个闭包的例子

function outter(){ 
 var n = 0; 
 return 
   function (){ 
 return n++; 
 } 
 } 
 
 var o1 = outter(); 
 o1();//n == 0 
 o1();//n == 1 
 o1();//n == 2 
 var o2 = outter(); 
 o2();//n == 0 
 o2();//n == 1 

匿名函数 function(){return n++;} 中包含对 outter 的局部变量 n 的引用,因此当 outter 返回时,n 的值被保留 ( 不会被垃圾回收机制回收 ),持续调用 o1(),将会改变 n 的值。而 o2 的值并不会随着 o1() 被调用而改变,第一次调用 o2 会得到 n==0 的结果,用面向对象的术语来说,就是 o1 和 o2 为不同的 实例,互不干涉。

总的来说,闭包很简单,不是吗?但是,闭包可以带来很多好处,比如我们在 Web 开发中经常用到的:

清单 9. jQuery 中的闭包

 var con = $("div#con"); 
 setTimeout( function (){ 
 con.css({background:"gray"}); 
 }, 2000); 

上边的代码使用了 jQuery 的选择器,找到 id 为 con 的 div 元素,注册计时器,当两秒中之后,将该 div 的背景色设置为灰色。这个代码片段的神奇之处在于,在调用了 setTimeout 函数之后,con 依旧被保持在函数内部,当两秒钟之后,id 为 con 的 div 元素的背景色确实得到了改变。应该注意的是,setTimeout 在调用之后已经返回了,但是 con 没有被释放,这是因为 con 引用了全局作用域里的变量 con。

使用闭包可以使我们的代码更加简洁,关于闭包的更详细论述可以在参考信息中找到。由于闭包的特殊性,在使用闭包时一定要小心,我们再来看一个容易令人困惑的例子:

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:JavaScript 函数 编程

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