我需要在Javascript中将参数传递给回调函数,所以我做了以下操作,创建了一个匿名函数作为字符串然后传递它:
var f = "var r = function(result) {do_render(" + i + ",result.name,result.data);}"
eval(f)
$.getJSON("analysis?file=" + getParameterByName('file') + "&step=" + i,r);
然而,这似乎不是一个好主意。还有更好的方法吗?
答案 0 :(得分:1)
您可以使用几种技术来执行此操作。其中之一是创建一个“封锁”其中一个变量的新功能:
function myCallback(i, result) { ... }
function createCurriedFunction(i, func, context) {
return function (result) { func.call(context, i, result); }
}
for (i = 0; i < 5; i += 1) {
var curriedFunc = createCurriedFuncion(i, myCallback, this);
$.getJSON(url, curriedFunc);
}
Context是回调函数中“this”将引用的对象。你正在做的事情可能需要也可能不需要;如果没有,你可以传入null。
实际上有一个函数可以完全调用bind,并且像
一样使用var curriedFunc = myCallback.bind(this, i), which will seal off the first variable.
答案 1 :(得分:0)
看起来您在关闭i
时遇到问题并使用eval来解决它。而不是那样,只需使用立即调用的函数表达式(IIFE)来关闭它,如下所示:
(function(i){
//create a closure of the value of i
//so that it takes the immediate value of it instead of the end value
//based on the assumption i is from a loop iterator
$.getJSON("analysis?file=" + getParameterByName('file') + "&step=" + i,
function(result){
do_render(i, result.name, result.data);
}
);
})(i);//pass i into the IIFE in order to save its immediate value
答案 2 :(得分:0)
你可以简单地做
var url = "myurl";
$.getJSON(url, function(result){
//callback function
});