将变量传递给引用函数?
问题描述:
我currntly有一个javascript AJAX调用一个匿名函数:将变量传递给引用函数?
(此代码已被削减到要领,可能有一些误差)
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;
}
}
}
})
};
我想INSEAD使用
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;
}
}
}
})
此时,类型变量不再被定义。我能以某种方式解决此问题吗?
答
一种方法可以工作是利用上$.ajax
的context
参数 - 例如:
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
,这是我们从call
内保存到context
的type
相同的值。
答
是的,你可以解决通过定义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');
答
您可以让成功函数返回需要传递给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;
}
}
}
你有没有尝试过将类型作为第二个变量?所以你将有函数successfunction(data,type){...},然后从成功传递类型作为参数:successfunction(data,type) – Kamal 2012-08-01 10:49:24
你在哪里定义函数?如果你不需要它在'call()'之外,你可以尝试在它内部定义它,因此它与'type'变量共享相同的范围。 – 2012-08-01 10:50:43