调用变量中命名的JavaScript函数

时间:2009-11-12 15:59:10

标签: javascript function variables

我有一个JavaScript变量,其中包含JavaScript函数的名称。此功能存在于页面上,已使用$ .ajax等加载和放置

有人能告诉我如何调用变量中命名的javascript函数吗?

函数的名称在变量中,因为用于加载页面片段的URL(插入当前页面)包含要调用的函数的名称。

我愿意接受有关如何实施此解决方案的其他建议。

4 个答案:

答案 0 :(得分:240)

我会避免评估。

要解决此问题,您应该了解JavaScript的这些内容。

  1. 函数是第一类对象,因此它们可以是对象的属性(在这种情况下,它们被称为方法),甚至可以是数组的元素。
  2. 如果您没有选择函数所属的对象,则它属于全局范围。在浏览器中,这意味着你将它挂在名为“window”的对象上,这就是全局变量所在的对象。
  3. 阵列和物体密切相关。 (谣言是他们甚至可能是乱伦的结果!)您通常可以使用点 . 而非方括号 [] 替换,或者反之亦然。
  4. 您的问题是考虑点参考方式而不是方括号方式的结果。

    所以,为什么不喜欢,

    window["functionName"]();
    

    这假设你的功能存在于全球空间。如果你已经命名空间,那么:

    myNameSpace["functionName"]();
    

    避免使用eval,并避免将字符串传递给setTimeout和setInterval。我写了很多JS,我从不需要eval。 “需要”评估来自于不够深入了解语言。您需要了解范围,上下文和语法。如果你曾经坚持过eval,那就问 - 你会很快学会。

答案 1 :(得分:60)

如果它在全球范围内,最好使用:

function foo()
{
    alert('foo');
}

var a = 'foo';
window[a]();

eval()。因为eval()evaaaaaal

正如诺斯雷德纳在我之前40秒说的那样>。<

答案 2 :(得分:22)

绝对不要使用eval来做这样的事情,否则你会打开自己的XSS(跨站点脚本)漏洞。

例如,如果你使用这里提出的eval解决方案,那么一个邪恶的用户可以发送一个链接给他们的受害者,如下所示:

http://yoursite.com/foo.html?func=function() {警报( '林%20英寸%20Teh%20Codez');}

他们的javascript,不是你的,会被执行。这个代码可以做的事情远比仅仅弹出警报更糟糕;它可以窃取cookie,向你的应用程序发送请求等。

因此,请确保您永远不会eval来自用户输入的不受信任的代码(以及查询字符串ID中的任何内容都被视为用户输入)。您可以将用户输入作为指向您的函数的键,但如果给定的字符串与对象中的键不匹配,请确保不执行任何操作。例如:

// set up the possible functions:
var myFuncs = {
  func1: function () { alert('Function 1'); },
  func2: function () { alert('Function 2'); },
  func3: function () { alert('Function 3'); },
  func4: function () { alert('Function 4'); },
  func5: function () { alert('Function 5'); }
};
// execute the one specified in the 'funcToRun' variable:
myFuncs[funcToRun]();

如果funcToRun变量未指向myFuncs对象中的任何内容,则会失败,但它不会执行任何代码。

答案 3 :(得分:4)

这有点难看,但它是我头脑中的第一件事。这也应该允许你传入参数:

eval('var myfunc = ' + variable);  myfunc(args, ...);

如果你不需要传递参数,这可能会更简单。

eval(variable + '();');

标准干码警告适用。