fnObj=window[functionName]不是函数问题-eval()运行良好

fnObj = window[functionName] is not a function issue - eval() works well

本文关键字:-eval 问题 运行 函数 window functionName fnObj      更新时间:2023-09-26

我只是过度使用JS代码,希望用window[functionName]替换我的eval()。所以我只是在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[object的属性'dummyFn'Window]不是的功能

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

我很好奇我在哪里犯了错。是的,我试图激发的函数存在,并且是用var定义的。这个概念是否不可能在ajax响应中使用?

谢谢你的帮助。

(使用jQuery(

如果在闭包中声明函数,则它不是窗口的成员。示例:

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];