JavaScript中回调函数传递参数的实现

By lincanbin at 2014-11-08 • 3人收藏 • 724人看过
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
2014-11-08   #1
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);
            }
        });
    }
}

像这样

alert(ID);

ID是undefined,因为超出了函数参数/变量 ID 的作用域的,不了解异步机制的人容易犯这种错误。

登录后方可回帖

登 录
信息栏
购买PHP虚拟主机 / VPS

Carbon Forum是一个基于话题的高性能轻型PHP论坛

下载地址:Carbon Forum v5.0.1
QQ群:12607708(QQ我不常上)

donate

手机支付宝扫描上方二维码可向本项目捐款

Loading...