好的,我有以下功能:
function add_like(post_id) {
$.post('php/like_add.php', {post_id:post_id}, function(data){
if (data == 'success') {
bump_get(photo_id).done(function(){
toggle_visibility('bump_img'+post_id);
});
} else {
alert(data);
}
});
}
目前正在运行,php/like_add.php
echo success
正确运行。问题是,对于主要的帖子函数,我将post_id传递给它,但对于.done(function()
; post_id没有传递给它。因此toggle_visibility
的ID变为'like_post_'而不是'like_post_x'。如何将变量从之前运行的函数传递给.done函数?
我尝试bump_get(photo_id).done({photo_id:photo_id}, function(){
,但这不起作用。
有什么想法吗?
答案 0 :(得分:1)
由于javascript中的变量范围和闭包的工作方式,您的回调函数中已经存在正确的post_id
值。
当您调用add_like()
时,会创建一个新范围,并在该范围内创建post_id
变量,因为它是该函数的参数。该范围内的变量在函数执行期间可用,以及函数结束后可用于创建的任何匿名函数(闭包) - 例如回调。
作为一个概念验证,请参阅以下简化代码,您可以在此处运行:http://jsfiddle.net/R4HNx/
function add_like(post_id) {
setTimeout(function() {
alert(post_id);
}, 2000);
}
add_like(10);
这用简单的setTimeout()
调用替换了ajax回调,但它是相同的概念 - 我们定义了一个将在未来的某个时刻运行的回调函数,并使用来自父函数的变量在回调实际运行之前很久就会返回。
答案 1 :(得分:0)
您可以使用立即调用的匿名函数包含变量:
function add_like(post_id) {
$.post('php/like_add.php', {post_id:post_id}, function(data){
if (data == 'success') {
bump_get(photo_id).done((function(post_id){
return function(){
toggle_visibility('bump_img'+post_id);
};
})(post_id));
} else {
alert(data);
}
});
}