在settimeout函数中使用ajax请求json输出

在请求之后我有一个jquery变量

type: 'POST', data: data, cache: false, success: function (data) { var json = jQuery.parseJSON(data); 

我试图使用超时在五秒后触发下面的function。

  $("#a" + json.id).fadeOut(300); 

目前我正在做

  setTimeout('$("#a" + json.id).fadeOut(300)', 500); 

但它似乎没有用

setTimeout将函数和数字作为参数,试试这个:

 setTimeout(function() { $("#a" + json.id).fadeOut(300); }, 500); 

不确定json.id的值是否在调用超时回调时发生变化。

请考虑以下示例:

 for (var i=0;i<10;i++){ setTimeout(function(){console.log(i)},500); } 

回调函数看到i = 10,因为这是调用函数时i的值。 您可以使用闭包进行预绑定:

 var f=function(id){ setTimeout(function(){console.log(id);},500); } for (var i=0;i<10;i++) f(i); 

既然您已经了解了封闭和预绑定的工作方式,那么这里是您问题的更强大的解决方案:

 var f=function(id){ setTimeout(function(){$('#a'+id).fadeOut(300);},500); } f(json.id); 

您的代码不起作用,因为String在全局上下文中被评估。 因此,为了使它工作,您可以使json全局(删除var)。

此外,虽然我不确定您从哪里调用setTimeout ,但假设它在回调内,您可以选择将id作为字符串的一部分:

 setTimeout('$("#a'+json.id+'").fadeOut(300)', 500); 

但肯定更好的选择是不惜一切代价避免eval和全局变量(结账Eval是邪恶的 , 为什么全局状态是精心解释的恶魔 )并传递一个闭包:

 setTimeout(function(){ $("#a" + json.id).fadeOut(300); }, 500);