0

我想触发一个函数。不幸的是,我不能直接调用它,因为函数的名称是作为字符串提供的。

例子:

功能我的功能(){
   alert('我是我的函数');
}
函数另一个函数(){
   alert('我是另一个函数');
}

var func_name = 'myFunction';

$obj = jQuery('a');

$obj.each(函数(){
   $(this).func_name(); // eval 在这里没有帮助 :(
});

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

更新:好吧,在测试了一些答案之后,我的问题描述似乎并不完整。:OI 更新了代码以包含一个对象,我希望在该对象上附加/运行该函数。

再次感谢!

4

4 回答 4

7

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

随着您更新的问题:

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

//to this:
$(this)[func_name]();
于 2009-09-20T14:41:11.793 回答
2

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

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

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

(请注意,在浏览器中, Global Object 通常与 global 引用的对象是同一个对象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'];
于 2009-09-20T15:19:51.043 回答
2

对于方法,使用

obj[func_name]()

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

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

eval(func_name)()
于 2009-09-20T14:52:38.250 回答
0
eval(func_name + "()");

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

于 2009-09-20T14:38:00.083 回答