我想调用我在jQuery的文档就绪函数中定义的函数,但是遇到了一些麻烦。我有以下代码:
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]
似乎不起作用。两个测试函数似乎不是窗口变量中的索引。我很感激帮助和知识。
答案 0 :(得分:11)
我只能想到不使用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]();
}
});
或者可以在函数的定义中完成注册。如果它们是全局函数,它们将隐式注册在window
对象上,但它们不是全局的,因为它们的作用域是document.ready处理函数:
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]();
}
});
答案 1 :(得分:3)
如果不是Eval,最好的方法是使用零毫秒的setTimeout,因为你可以将函数指定为字符串。
setTimeout('myfunction()',0,);