javascript - fnObj = window[functionName] 不是函数问题 - eval() 效果很好

标签 javascript jquery ajax

我只是过度使用了我的 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))+"')");
     }
 }
 ...

新代码:

Returns: Uncaught TypeError: Property 'dummyFn' of object [object Window] is not a function

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

我很好奇我在哪里犯了错误。是的,我尝试触发的函数存在,并且是用 var 定义的。这个概念是否无法在 ajax 响应中使用?

感谢您的帮助。

(使用 jQuery)

最佳答案

如果你在闭包中声明你的函数,它就不是 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];

关于javascript - fnObj = window[functionName] 不是函数问题 - eval() 效果很好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14403003/

相关文章:

jQuery 单击事件 - 第一次单击进行 ajax 调用,随后单击切换

javascript - 滚动后修复导航栏并平滑滚动下方的内容

javascript - Web 服务 C# 返回未定义的值

javascript - jQuery fadeIn(), animation() 函数是非阻塞的吗?

javascript - 按文本区域的平方限制输入符号

JavaScript:将 post 请求 json 字符串附加到现有 json 文件

javascript - 使用查询字符串进行缓存清除

javascript - 如何将 React Native 自定义警报作为函数调用?

javascript - 如果子 LI 包含特定类,则将类应用于父 UL

Chrome 72 更新后 Android Cordova 应用渲染缓慢