JavaScript中回调函数传递参数的实现
By
lincanbin
at 2014-11-08 • 5人收藏 • 4132人看过
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
登录后方可回帖
像这样
ID是undefined,因为超出了函数参数/变量 ID 的作用域的,不了解异步机制的人容易犯这种错误。