论坛首页 Web前端技术论坛

多参数回调函数的陷阱

浏览 3232 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-08-20  
由于目前AJAX的大型其道,所以打算把公司一个报表系统改造成AJAX形式的,结果就遇到了下面的问题
js 代码
  1. for(var i=0;i<resultFillVOArray.length;i++) //循环填充结果   
  2. {          
  3.         log.debug("开始调用第"+(i+1)+"个数据源...");   
  4.         var resultFillVO = resultFillVOArray[i];    //获得结果填充配置对象           
  5.                                    
  6.         reportCellService.listBySql(listSql,function(data){cellResultSetCallback(data,_cellObj,resultFillVO);});           
  7.            
  8. }  

cellResultSetCallback这个函数用到了循环中resultFillVO这个对象,结果实际调用时,这个resultFillVO老是取到的都是FOR循环的最后一个对象。不知道有谁还遇到过类似问题,请教一下怎么解决的

 

   发表时间:2007-08-20  
另外这个回调函数还不支持resultFillVOArray[i]这样的参数,即当中有i这个变量。
JS中对象、数组以及函数是按引用来复制、传递和比较的,这让人非常的郁闷,稍微不小心就把原始对象中的值给改变了!
0 请登录后投票
   发表时间:2007-08-20  
function(data){cellResultSetCallback(data,_cellObj,resultFillVO);})
你这中写法是返回一个函数,而不是马上执行,当你的listBySql真想执行参数中的那个函数时,resultFillVO已经指向你的数组的最后一个了,所以你rsultFillVO老是取到的都是FOR循环的最后一个对象
改成
function(data){cellResultSetCallback(data,_cellObj,resultFillVOArray[i]);})

0 请登录后投票
   发表时间:2007-08-20  
javascript里resultFillVO的作用域是整个函数,而不是for循环,所以最后都指向数组最后一个元素了。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics