6

我只是过度使用我的 JS 代码并希望eval()window[functionName]. 所以我只是在 JSFiddle 中做了一个快速测试,所有的工作都很好,下面的行:

var fnName = "Page_test";
var foo = "yammy";
var Page_test = function(bar) {
    return bar;
}
var Obj = window[fnName];
alert(Obj(foo));

链接到这个 JSFiddle -> http://jsfiddle.net/juSHj/

现在我尝试将以下代码行替换为eval()具有上述概念的邪恶:

旧代码:(像魅力一样工作/在ajax成功后被解雇)

 ...
 success: function(ret) {
     if(returnFnAjaxForm != "") {
          eval(returnFnAjaxForm+"('"+encodeURI(jQuery.trim(ret))+"')");
     }
 }
 ...

新代码:

返回:未捕获的类型错误:对象 [object Window] 的属性 'dummyFn' 不是函数

...
success: function(ret) {
     if(returnFnAjaxForm != "") {
          fnObj = window[returnFnAjaxForm];
          if(typeof(fnObj) == "function") { // this is optional
               fnObj(encodeURI(jQuery.trim(ret)));
          }
     }
} 
...

我很好奇我在哪里犯了错误。是的,我尝试触发的功能存在并且用var. 这个概念可能无法在 ajax 响应中使用吗?

谢谢你的帮助。

(使用 jQuery)

4

1 回答 1

13

如果你在闭包中声明你的函数,它就不是 window 的成员。例子 :

var in_window = '132';
alert(window['in_window']); // Alert 132

(function() {
    var not_in_window = '132';
    alert(window['not_in_window']); // Alert undefined
})();

因此,请注意声明Page_test变量的位置。如果你真的想放入窗口,你可以这样做window.Page_test = Page_test

您能做的最好的事情就是为所有可能的回调使用一个对象。像这样 :

var callbacks = {
    foo : function() {},
    foo1 : function() {},
    foo2 : function() {},
    foo3 : function() {}
};

var obj = callbacks[fnName];
于 2013-01-18T16:20:02.953 回答