我在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;
}
}
}
})
此时,不再定义类型变量。我可以以某种方式解决这个问题吗?
答案 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;
}
}
}