对于使用UIWebView的iPad应用程序,我将回调函数传递给URL中的应用程序:
function query(db, query, callback) {
var iframe = document.createElement("IFRAME");
// Filter comments from the callback (as this would break things).
var callbackstr = "" + callback;
callbackstr = callbackstr.replace(/\/\*.+?\*\/|\/\/.*(?=[\n\r])/g, '');
// Put the query + the callback in an url that will be caught by the iOS app.
iframe.setAttribute("src", "ios-query:#iOS#" + query +":#iOS#"+ callbackstr);
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null;
}
应用程序从URL解析回调函数,并使用通过stringByEvaluatingJavaScriptFromString插入的一些数据调用回调函数。这一切都很好。
但是,现在我想在回调函数中使用闭包,如下所示:
var callback = function (problemdata) {
// Return the 'real' callback.
return function (tx, results) {
// Do something with problemdata
}
}(problemdataFromScopeChain)
这是有问题的。由于回调函数转换为字符串,因此所有范围链信息都将丢失。
有关如何解决此问题的任何建议?
编辑:
我更喜欢“查询”功能方面的解决方案。例如:有没有办法将范围链中的变量转换为eval() - 字符串?
答案 0 :(得分:3)
您是否可以传递一个与回调数组中的索引相对应的ID,而不是将回调函数本身传递给查询页面?
例如
var callback = function(problemdata){
// Do stuff
};
callbacks = [];
callbacks.append(callback); // so index of 0
现在,您使用回调索引而不是实际的回调函数
来提供iframe src查询最后,您的查询服务器端脚本可以返回
行callbacks[0]("this is a load of JSON for example");
答案 1 :(得分:0)
var problemdataFromScopeChain = 4;
var callback = function(problemdata){
// Return the 'real' callback.
//return function (tx, results) {
// // Do something with problemdata
// return tx + results + problemdata;
//}
return new Function('tx', 'results', 'return tx + results + ' + problemdata + ';');
}(problemdataFromScopeChain);
alert('' + callback);
但是在我看来使用像这样的Function构造函数不是很好=)。 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function