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

JavaScript 中的函数式编程实践

 2010-06-23 00:00:00 来源:WEB开发网   
核心提示: 清单 10. 错误的使用闭包varoutter=[];functionclouseTest(){vararray=["one","two","three","four"];for(vari=0;i<array.

清单 10. 错误的使用闭包

 var outter = []; 
 function clouseTest () { 
 var array = ["one", "two", "three", "four"]; 
 for ( var i = 0; i < array.length;i++){ 
 var x = {}; 
  x.no = i; 
  x.text = array[i]; 
 x.invoke = function (){ 
 print(i); 
  } 
  outter.push(x); 
 } 
 } 

上边的代码片段很简单,将多个这样的 JavaScript 对象存入 outter 数组:

清单 11. 匿名对象

 { 
 no : Number, 
 text : String, 
 invoke : function (){ 
 // 打印自己的 no 字段 
 } 
 } 

我们来运行这段代码:

清单 12. 错误的结果

 clouseTest();// 调用这个函数,向 outter 数组中添加对象 
 for ( var i = 0, len = outter.length; i < len; i++){ 
 outter[i].invoke(); 
 } 

出乎意料的是,这段代码将打印:

 4 
 4 
 4 
 4 

而不是 1,2,3,4 这样的序列。让我们来看看发生了什么事,每一个内部变量 x 都填写了自己的 no,text,invoke 字段,但是 invoke 却总是打印最后一个 i。原来,我们为 invoke 注册的函数为:

清单 13. 错误的原因

function invoke(){ 
 print(i); 
 } 

每一个 invoke 均是如此,当调用 outter[i].invoke 时,i 的值才会被去到,由于 i 是闭包中的局部变量,for 循环最后退出时的值为 4,因此调用 outter 中的每个元素都会得到 4。因此,我们需要对这个函数进行一些改造:

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

Tags:JavaScript 函数 编程

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