将回调函数作为字符串传递,同时保留范围链

时间:2011-06-28 13:26:22

标签: javascript ios uiwebview closures scope-chain

对于使用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() - 字符串?

2 个答案:

答案 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