将变量传递给引用函数?

时间:2012-08-01 10:47:00

标签: javascript jquery

我在javascript ajax-call中有一个无名函数:

(此代码已被删减至基本要素,可能存在一些错误)

function call(name){
    var type = services[name].type


    $.oajax({
        success: function(data) {
            fbposts=data.data
                if (type === "grupp"){
                    var postid=fbposts[fbpost].id.split("_");
                    return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/'
                }
                else if (fbposts[fbpost].actions){
                    return fbposts[fbpost].actions[0].link;
                }
            }
        }       
    })
};

我想要使用

success: successfunction,

并引用这样的函数:

function success(data) {
            fbposts=data.data
                if (type === "grupp"){
                    var postid=fbposts[fbpost].id.split("_");
                    return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/'
                }
                else if (fbposts[fbpost].actions){
                    return fbposts[fbpost].actions[0].link;
                }
            }
        }       
    })

此时,不再定义类型变量。我可以以某种方式解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

可行的一种方法是使用context上的$.ajax参数 - 例如:

function successFunction(data) {
    fbposts=data.data;
    if (type === "grupp"){
        var postid=fbposts[fbpost].id.split("_");
        return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/'
    }
    else if (fbposts[fbpost].actions){
        return fbposts[fbpost].actions[0].link;
    }
}

function call(name){
    var type = services[name].type;
    $.oajax({
        success: successFunction,
        context: { type: type }
    );
}

使用context会导致this函数中的success指向您传递给context的任何内容。所以在上面的例子中,当我们在successFunction内阅读

if (type ...)

这意味着type引用this.type,这与我们从type内保存到context的{​​{1}}的值相同。

答案 1 :(得分:1)

是的,您可以通过在success()内定义call来解决这个问题,因此范围相同:

function call(name){
    var type = services[name].type;
    function success(data) {
                fbposts=data.data
                    if (type === "grupp"){
                        var postid=fbposts[fbpost].id.split("_");
                        return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/'
                    }
                    else if (fbposts[fbpost].actions){
                        return fbposts[fbpost].actions[0].link;
                    }
                }
            }       
        })

    $.oajax({
        success: success   
    })
};

替代解决方案是将其存储在外面,例如。在某些外部范围,某些变量中,或附加到其中一个DOM元素。

你也可以使用一个包装器,使用正确的类型调用将返回成功函数,知道这样的类型:

function make_success(type){
    return function(data){
        // do what you need for success callback
    };
}
var my_success_callback = make_success('some_type');

答案 2 :(得分:0)

你可以让success函数返回你需要传递给ajax的函数,并将类型变量传递给父函数 - 就像Python装饰器一样。这是一个例子:

function call(name){
    var type = services[name].type;

    $.ajax({
        success: success(type)
    })
};

function success(type) {
    return function(data) {
        // We have access to 'type' in here!

        fbposts=data.data;
        if (type === "grupp"){
            var postid=fbposts[fbpost].id.split("_");
            return "https://www.facebook.com/groups/"+postid[0]+"/permalink/"+postid[1]+'/'
        }
        else if (fbposts[fbpost].actions){
            return fbposts[fbpost].actions[0].link;
        }
    }
}