`
littcai
  • 浏览: 248165 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

多参数回调函数的陷阱

阅读更多
由于目前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循环的最后一个对象。不知道有谁还遇到过类似问题,请教一下怎么解决的

 

分享到:
评论
3 楼 fyting 2007-08-20  
javascript里resultFillVO的作用域是整个函数,而不是for循环,所以最后都指向数组最后一个元素了。
2 楼 campaign 2007-08-20  
function(data){cellResultSetCallback(data,_cellObj,resultFillVO);})
你这中写法是返回一个函数,而不是马上执行,当你的listBySql真想执行参数中的那个函数时,resultFillVO已经指向你的数组的最后一个了,所以你rsultFillVO老是取到的都是FOR循环的最后一个对象
改成
function(data){cellResultSetCallback(data,_cellObj,resultFillVOArray[i]);})

1 楼 littcai 2007-08-20  
另外这个回调函数还不支持resultFillVOArray[i]这样的参数,即当中有i这个变量。
JS中对象、数组以及函数是按引用来复制、传递和比较的,这让人非常的郁闷,稍微不小心就把原始对象中的值给改变了!

相关推荐

    C语言中的回调函数

    在C语言编程中,回调函数是程序设计中的一个重要概念。...通过本课程的学习,学员将能够熟练掌握回调函数的使用方法,合理避免使用中的常见陷阱,并能够根据需要在实际编程工作中设计和实现回调函数。

    理解javascript回调函数

    回调函数的一个主要问题是,当多个异步操作需要按顺序执行时,可能会导致代码嵌套(所谓的“回调地狱”),这种情况的解决方法通常使用Promise、async/await等现代JavaScript的特性来替代传统的回调。 在回调函数中...

    用net-snmp的api实现trap接收,windows+linux

    4. **编写陷阱处理回调**:回调函数应该能够解析接收到的陷阱并采取适当的行动。你可以使用`snmp_varbind_list`结构体来处理陷阱中的变量绑定,然后通过`asn1_decode()`等函数解码SNMP报文。 5. **处理SNMP请求**:...

    全息光镊HOT arrxy API 手册

    帧回调函数在每次帧更新完成后被调用,可用于监控系统状态或执行其他任务。 **1.1.15 序列结束回调函数** 当一系列操作完成后,序列结束回调函数会被调用。 **6.10 HOT API 编程参考** 这部分详细介绍了HOT API...

    JavaScript 匿名函数和闭包介绍

    匿名函数通常用于回调函数,异步编程和事件处理程序等场景中。IIFE常用于创建闭包,或保持私有状态不被外部访问。 接下来,闭包的概念是需要重点理解的。闭包是函数和声明该函数的词法环境的组合。换句话说,闭包...

    c#键盘鼠标钩子.zip

    4. **多线程处理**:因为钩子可能在任何线程上下文中被调用,所以回调函数必须能够安全地跨线程运行。这可能需要使用`Control.Invoke`或`Control.BeginInvoke`来确保UI更新在正确的线程中执行。 5. **内存管理**:...

    js中settimeout方法加参数.docx

    这些参数会在回调函数执行时作为参数传递给它。例如: ```javascript function timedMsg(message) { var t = setTimeout(function() { console.log(message); }, 3000); } timedMsg("Hello, World!"); ``` 在...

    javascript让setInteval里的函数参数中的this指向特定的对象

    此外,这段代码还展示了如何使用异步请求(`Connect.asyncRequest`),其中包含成功和失败的回调函数,以及传递自定义参数的方式。回调函数中,`this` 依然可以指向正确对象,因为它们也是闭包的一部分,保留了外部...

    动态循环给onclick赋值(解决闭包问题)

    4. **使用数组存储回调函数**:将每个回调函数存储在一个数组中,然后在循环外为元素绑定事件。 ```javascript const callbacks = []; for (let i = 0; i ; i++) { callbacks.push(function() { console.log(i); ...

    深入解析C语言中函数指针的定义与使用

    在实际应用中,函数指针常用于回调函数、作为其他函数的参数,或者在数据结构中存储函数实现等场景。 3. 强制类型转换: 在某些情况下,我们可能需要进行类型转换,例如将函数指针转换为其他类型,如`int`类型。...

    vb Hook 监听 捕捉键盘,鼠标事件

    在回调函数中,可以检查`wParam`和`lParam`参数来获取鼠标的详细信息,例如鼠标按钮状态、相对屏幕的位置等。 在VB中实现键盘和鼠标事件的监听,需要对Windows API有深入的理解,包括各种消息、结构体以及如何正确...

    5JS有关JAVASCRIPT 编程PPT

    理解回调函数的原理和陷阱,以及如何使用Promise进行错误处理和链式调用,以及async/await的同步写法,将有助于编写更优雅的异步代码。 AJAX(Asynchronous JavaScript and XML)是用于创建动态网页的关键技术,它...

    ECMAScript6的新特性箭头函数(Arrow Function)详细介绍

    在上面的例子中,由于`addEventListener`的回调函数是一个普通函数,`this`在回调函数内部指向全局对象(在浏览器中是`window`),而不是`PageHandler`。如果使用箭头函数,这个问题将得到解决: ```javascript var...

    libevent_libev实战那些坑1

    `evconnlistener_new`和`evconnlistener_new_bind`分别是已存在监听套接字和需要创建监听套接字时使用的接口,它们需要提供事件基础结构`event_base`、回调函数以及错误回调函数等信息。当连接请求到达时,会调用`...

    JavaScript ES6箭头函数使用指南

    总结来说,JavaScript ES6的箭头函数提供了更简洁的语法,使得代码更易读、更易维护,同时解决了`this`指向的问题,尤其在回调函数和异步编程中显得尤为实用。然而,理解箭头函数如何处理`this`至关重要,以避免潜在...

    《你不知道的JavaScript》脑图笔记

    9. **回调函数**:处理异步操作的传统方式,但容易导致回调地狱(Callback Hell)问题。 10. **Promise**:为异步操作提供了一种更好的处理方式,允许多个异步操作链式调用,并处理成功和失败的情况。 11. **async/...

    cpp代码-成员函数指针使用

    这种技术在某些情况下非常有用,比如在回调函数、事件驱动编程或者设计模式如策略模式中。本文将深入探讨C++中的成员函数指针及其使用方法。 首先,我们要明白成员函数指针与普通函数指针的区别。普通函数是全局...

    JavaScript模式(中文版带目录)

    这部分可能涵盖变量作用域、闭包、异步编程(如回调函数、Promise、async/await)以及错误处理等基础但至关重要的主题。了解这些技巧可以帮助开发者避免常见的陷阱,写出更健壮的代码。 三、字面量和构造函数 ...

Global site tag (gtag.js) - Google Analytics