如何向回调函数中传入其他参数

本文介绍了在JavaScript中向回调函数传递参数的四种方法:使用全局变量、Closure、不同签名及匿名函数。Closure被认为是最优雅且实用的方式。
最近写JS经常会因为向回调函数中传参而头疼,今天总结一下向回调函数中传参的方法,以后的应用中就不用在到处去找了。



首先构建一个需要向回调函数中传入参数的典型应用。在一个页面中产生了一系列的向Ajax Proxy的请求,传入的是一个ID,根据ID返回了不同的内容值,我们需要把这些内容打印在页面上,同时给页面元素赋予ID,这个时候就需要向回调函数中传入ID,以产生带ID的页面元素。



第一种方法就是使用全局变量,能够被函数和回调函数同时访问。这种方法虽然不够优雅,但是确实能够完成任务。



这种方法在传入单个的变量时没什么问题,但是当我们在一个循环的结构中,不断的传入变量到回调函数,这个时候传入的变量会采用最后一次传入的变量值,这就与我们预想的结果有了出入。



第二种办法是使用Closure,这种方法更加优雅一些。通过使用Closure,我们通过匿名函数来重新包装返回的对象,同时将需要传入的参数做为新的属性传给回调函数。



第三种方法假设你需要为你的回调函数使用不同的签名,例如Ajax.Net的专家们允许你在回调中使用额外的参数,如果你想从一个换到另外一个并且保持兼容性的话,就要用到下面的写法:



第四种办法其实就是Closure的一种变体,你不需要显示的声明一个回调函数,而是使用一个匿名函数直接进行你所需要的处理。
如何向回调函数中传参数



总结一下:向回调函数中传入参数的终极办法其实就是利用Closure,这个看来是唯一可行而且比较优雅的方法,下面将Closure的写法列在下面:

var callback = {
success:function(data){
var item = document.createElement("li");
item.id = data.id;
item.innerHTML = "The id is : " + data.id;
item.innerHTML += " The value is : " + data.value;

var parent = document.getElementById("result");
parent.appendChild(item);
},
failure:function(){
alert('failure:');
}
}

xhr = new QueuedHandler();
for(var i=0;i<20;i++){
xhr.request('get','ajaxproxy.php?id='+i,function(data){ //第二种办法:利用Closure
data = eval('(' + data + ')');
data.id = i;
callback.success(data);
});

}
POSIX Timer 提供了一个在 Unix 系统上定时触发事件的功能。回调函数是这个机制的核心部分,每当系统准备好执行特定的任务时,就会调用预先指定的回调函数。 ### 回调函数参数 POSIX Timer 的回调函数通常需要满足以下几个关键点: 1. **函数原型**: ```c void (*timer_callback)(void *data); ``` 这里的 `timer_callback` 指向用户自定义的回调函数,并且它接受两个参数:第一个是函数体内的上下文信息,第二个是用户数据指针。 2. **上下文信息**: - 第一个参数通常是 void 类型,这代表了回调函数内部的上下文信息。它可以用来存储一些额外的数据,帮助回调函数完成特定任务。 3. **用户数据指针**: - 第二个参数是一个 void* 类型的指针,这是用户传递给计时器创建函数的任意数据。这个数据可以是任何类型的结构体或其他数据,取决于用户的需要。当回调函数被调用时,这个指针会传递给回调函数,允许回调函数访问和操作用户数据。 4. **回调函数的实现**: 用户需要编写一个 C 函数,该函数将作为 POSIX Timer 的回调函数。这个函数应该能够接收上述描述的两个参数,并在其内部执行相应的逻辑,比如更新状态、执行 I/O 操作、触发其他事件等。 5. **示例**: ```c #include <stdio.h> #include <signal.h> typedef struct { int value; char *name; } UserData; void on_timer(void *data) { UserData *user_data = (UserData *) data; printf("Timer triggered! Value is %d and name is %s\n", user_data->value, user_data->name); } int main() { UserData myData = {10, "Hello"}; struct itimerspec ts; ts.it_value.tv_sec = 1; // 设置计时器持续时间为1秒 ts.it_value.tv_nsec = 0; // 创建并设置计时器 if (timer_create(CLOCK_REALTIME, &ts)) { perror("Failed to create timer"); return 1; } // 将用户数据关联到计时器 if (timer_settime(timer_fd, 0, &ts, NULL)) { perror("Failed to set time for timer"); return 1; } // 将回调函数关联到计时器并传递用户数据 if (timer_add(timer_fd, &on_timer, (const void*) &myData)) { perror("Failed to add timer callback"); return 1; } // 主循环让程序继续运行直到计时器触发回调函数 while(1) {} return 0; } ``` 通过以上步骤,你可以实现一个简单的 POSIX Timer 系统,其中包含一个定制的回调函数,该函数可以根据用户数据执行特定的操作。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值