1

好的,所以我有以下功能:

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回声success正确。问题是对于主要的 post 函数,我将 post_id 传递给它,但是对于.done(function(); post_id 没有传递给它。所以 idtoggle_visibility变成了 'like_post_' 而不是 'like_post_x'。如何将变量从紧接在它之前运行的函数传递给 .done 函数?

我试过bump_get(photo_id).done({photo_id:photo_id}, function(){了,但这没有用。

有任何想法吗?

4

2 回答 2

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);

这用一个简单的调用替换了 ajax 回调setTimeout(),但它是相同的概念 - 我们正在定义一个回调函数,它将在未来的某个时间运行,并使用父函数中的一个变量,该变量将在回调之前很久就返回运行。

于 2013-07-27T20:40:15.837 回答
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);
        }
    });
}
于 2013-07-27T20:38:59.137 回答