JavaScript中回调函数传递参数的实现
By
lincanbin
at 2014-11-08 • 5人收藏 • 4562人看过
function ManageCallback(TargetTag)
{
this.Success=function(Json){
if(Json.Status==1){
//alert(Json.Message);
TargetTag.innerText = Json.Message;
//window.location.reload();
}else{
TargetTag.innerText = Json.ErrorMessage;
//alert(Json.ErrorMessage);
}
}
}
function Manage(ID, Type, Action, NeedToConfirm, TargetTag)
{
if(NeedToConfirm?confirm("确定执行该操作?"):true){
TargetTag.innerText = "Loading";
var CallbackObj=new ManageCallback(TargetTag);
$.ajax({
url:WebsitePath+"/manage",
data:{
ID: ID,
Type: Type,
Action: Action
},
cache: false,
dataType: "json",
type: "POST",
success: CallbackObj.Success
});
}
}上方代码为本站程序Carbon Forum的static/js/global.js (只代表今天这个版本,以后可能会修改)
JavaScript中回调函数是异步执行,实际上Manage函数内的局部变量无法作用到Ajax的Success回调函数中,因此想直接传递TargetTag(一个DOM对象)到Ajax的回调函数中是不可能的。
如果使用全局变量,多次调用Manage函数,因为异步执行,最后Ajax回调函数中获取到的TargeTag也无法确定,全局变量在多次调用Manage的过程中会被修改,而多个异步执行的Ajax如果不阻塞的话,无法确定回调的先后顺序。
所以采用了上面的方法,用对象实现回调函数传参,原理比较简明就不多说了。
https://github.com/lincanbin/Carbon-Forum/commit/411467cc75ff15a60a7aaa76521be7d5809c04ad
1 个回复 | 最后更新于 2014-11-08
登录后方可回帖

粤公网安备 44030602003677号
function Manage(ID, Type, Action, NeedToConfirm, TargetTag) { if(NeedToConfirm?confirm("确定执行该操作?"):true){ TargetTag.innerText = "Loading"; var CallbackObj=new ManageCallback(TargetTag); $.ajax({ url:WebsitePath+"/manage", data:{ ID: ID, Type: Type, Action: Action }, cache: false, dataType: "json", type: "POST", success: function(json){ alert(ID); } }); } }像这样
ID是undefined,因为超出了函数参数/变量 ID 的作用域的,不了解异步机制的人容易犯这种错误。