触发名称以字符串形式出现的函数

时间:2009-09-20 14:30:50

标签: javascript variables function autoload

我想开一个功能。不幸的是我无法直接调用它,因为函数的名称是以字符串形式提供的。

示例:

function myFunction() {
   alert('I am myFunction');
}
function anotherFunction() {
   alert('I am anotherFunction');
}

var func_name = 'myFunction';

$obj = jQuery('a');

$obj.each(function(){
   $(this).func_name(); // eval didn't help here :( 
});

显然这不起作用,因为JS期望func_name是一个有效的函数。有没有办法让myFunction()被触发而不是func_name()?感谢。

更新:嗯,在测试了一些答案后,似乎我的问题描述不完整。 :O我更新了代码以包含一个对象,我想要附加/运行该函数。

再次感谢!

4 个答案:

答案 0 :(得分:7)

没有理由使用eval。如果您的功能是全局的,请使用window[func_name]()

使用您更新的问题:

//the function $ returns an object, thus, this is changed
$(this).func_name();

//to this:
$(this)[func_name]();

答案 1 :(得分:2)

对于方法,请使用

obj[func_name]()

请记住,全局声明的函数是全局对象的属性(即浏览器中的window)。

对于本地功能,据我所知,没有办法

eval(func_name)()

答案 2 :(得分:2)

正如其他人所提到的,这是通过属性访问者运算符 - “[”和“]”完成的。在这种情况下,重要的是如何声明此函数,以及引用它的位置。

如果全局声明(即在全局范围内,作为函数声明或函数表达式),或者在某个时刻分配给全局对象的属性,则可以访问它作为全局对象的属性。在第3。在ECMAScript-262版本中,可以使用如下表达式访问全局对象:

(function(){ return this; })();
// or just `this` when in global scope

(请注意,在浏览器中,Global Object通常与全局window引用的对象相同,但不一定是这样。)

所以你可以访问全局函数:

var globalObj = (function(){ return this; })();
globalObj['your_func'];

// or via `window`
window['your_func'];

当函数本地声明时,通常会出现问题 - 这是在另一个函数体中:

(function(){
  function your_func(){};
  // how to access `your_func` here?
});

问题主要是由于虽然可以访问全局对象(如前面的例子),但无法访问函数的变量对象(即用作“基础”的对象“用于函数代码中的变量和函数声明。”

你当然可以在这种情况下使用eval,但这绝对是解决问题的错误方法。一种更容易,更兼容和运行时效率更高的方法是将函数作为某个本地对象的属性附加

(function(){
  ...
  function your_func(){}
  var funcs = { your_func: your_func };
  ...
})();

然后使用相同的括号来访问属性 - 有问题的属性引用函数:

funcs['your_func'];

答案 3 :(得分:0)

eval(func_name + "()");

Eval将获取一个字符串并在运行时对其进行评估。