Javascript 通过字符串调用jQuery定义的函数
我想调用我在jQuery的document ready函数中定义的函数,但遇到了一些麻烦。我有以下代码:Javascript 通过字符串调用jQuery定义的函数,javascript,jquery,Javascript,Jquery,我想调用我在jQuery的document ready函数中定义的函数,但遇到了一些麻烦。我有以下代码: jQuery(document).ready( function($) { function test1() { alert('test1'); } function test2() { alert('test2'); } var test_call = '2'; var fn = 'test' + te
jQuery(document).ready( function($) {
function test1() {
alert('test1');
}
function test2() {
alert('test2');
}
var test_call = '2';
var fn = 'test' + test_call;
// use fn to call test2
});
我不想使用
eval
,而且window[fn]
似乎不起作用。这两个测试函数似乎不是window变量中的索引。非常感谢您的帮助和知识。最好的方法(如果不是Eval的话)是使用setTimeout和零毫秒,因为您可以将函数指定为字符串
setTimeout('myfunction()',0,);
如果不使用
eval()
或某种形式的eval(将字符串传递给setTimeout()
是eval()
的一种形式),我所能想到的就是在对象上注册相关函数名,然后在该对象上查找函数名:
jQuery(document).ready( function($) {
function test1() {
alert('test1');
}
function test2() {
alert('test2');
}
// register functions on an object
var funcList = {};
funcList["test1"] = test1;
funcList["test2"] = test2;
var test_call = '2';
var fn = 'test' + test_call;
if (fn in funcList) {
funcList[fn]();
}
});
或者注册可以在函数的定义中完成。如果它们是全局函数,则会隐式注册到窗口
对象上,但它们不是全局函数,因为它们的作用域位于document.ready handler函数中:
jQuery(document).ready( function($) {
var funcList = {};
funcList.test1 = function test1() {
alert('test1');
}
funcList.test2 = function test2() {
alert('test2');
}
var test_call = '2';
var fn = 'test' + test_call;
if (fn in funcList) {
funcList[fn]();
}
});
或者,您可以将函数移动到全局范围,以便它们自动注册到窗口对象,如下所示:
function test1() {
alert('test1');
}
function test2() {
alert('test2');
}
jQuery(document).ready( function($) {
var test_call = '2';
var fn = 'test' + test_call;
if (fn in window) {
window[fn]();
}
});
您是在JSFIDLE或类似的工具上测试它吗?window[fn]将不起作用,因为您是在闭包中定义函数,所以它们不会添加到全局(window)作用域中。是否有一个函数带有参数而不是选项?即使没有显式调用
eval()
,这仍然使用eval()
内部的,并且受到eval可能涉及的任何问题的影响(例如从外部源执行任意代码)。这也不会在下一行代码之前同步发生,如果这很重要的话。我不确定是否缺少处理document.ready中作用域函数的另一个全局变量(或类似于jQuery的变量)。document.ready中的代码只是匿名函数中的代码,因此没有可在其中寻址的命名作用域。其中声明的函数只是局部函数(与局部变量相同)。您可以将函数定义移动到全局范围,这样它们就会自动注册到窗口对象中(请参阅我刚才添加到答案中的最后一个选项)。