Javascript fnObj=window[functionName]不是函数问题-eval()工作正常

Javascript fnObj=window[functionName]不是函数问题-eval()工作正常,javascript,jquery,ajax,Javascript,Jquery,Ajax,我只是过度使用我的JS代码,希望用窗口[functionName]替换我的eval()。因此,我刚刚在JSFIDLE中进行了一个快速测试,所有测试都可以很好地使用以下几行代码: var fnName = "Page_test"; var foo = "yammy"; var Page_test = function(bar) { return bar; } var Obj = window[fnName]; alert(Obj(foo)); (链接到此JSFIDLE->) 现在,我尝试

我只是过度使用我的JS代码,希望用
窗口[functionName]
替换我的
eval()
。因此,我刚刚在JSFIDLE中进行了一个快速测试,所有测试都可以很好地使用以下几行代码:

var fnName = "Page_test";
var foo = "yammy";
var Page_test = function(bar) {
    return bar;
}
var Obj = window[fnName];
alert(Obj(foo));
(链接到此JSFIDLE->)

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

旧代码:(像一个魔咒一样工作/在ajax成功后激发)

新代码:

返回:未捕获的TypeError:对象[object]的属性“dummyFn” 窗口]不是一个函数

我很好奇我在哪里犯了错。是,我尝试激发的函数存在,并且是用
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\u测试
变量。若你们真的想进入窗口,你们可以做
window.Page\u test=Page\u test

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

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

var obj = callbacks[fnName];

dummyFn
不会出现在代码示例中。你粘贴了正确的代码吗?此外,这看起来是正确的方法,错误可能在其他地方/愚蠢的地方。
Page\u test
dummyFn
很可能不是该窗口的成员。代码在哪里运行?在诸如
$(function(){…})
?@FritsvanCampen之类的范围内,
dummyFn
只是动态加载代码的示例。当我以这种方式启动它们时,控制台中只有一个错误-当我使用eval()@KevinB yes时工作正常,没有任何错误,两个函数都在同一个
$(function(){…})中
但是我不能复制整个JS,因为它的大小。@godesign如果你在
$(function(){…})
中,我的答案应该是解决方案。对,因为
eval
代码实际上没有使用
窗口[returnFnAjaxForm]
,而只是
returnfnaxform
。可能是这样:)谢谢,我的问题就要解决了。两个函数都在
$(function(){…})内运行-那么我可以使用类似于
这个['functionName']
的东西吗?@godesign No您不能使用
这个
来检索变量。我刚刚编辑了我的答案。@Magnus-很好的补充,我马上接受你的答案。谢谢大家。@Magus,我想要的多选回叫选项回答得很好
var in_window = '132';
alert(window['in_window']); // Alert 132

(function() {
    var not_in_window = '132';
    alert(window['not_in_window']); // Alert undefined
})();
var callbacks = {
    foo : function() {},
    foo1 : function() {},
    foo2 : function() {},
    foo3 : function() {}
};

var obj = callbacks[fnName];