调用变量中命名的 JavaScript 函数

我有一个 JavaScript 变量,它包含一个 JavaScript 函数的名称。此函数通过加载并使用 $放置在页面上而存在。Ajax 等等。

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

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

关于如何实现这个解决方案,我愿意听取其他建议。

269669 次浏览

这有点难看,但这是我第一个想到的。这也应该允许你传递参数:

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

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

eval(variable + '();');

标准干燥代码警告适用。

我会避开 Eval。

要解决这个问题,您应该了解有关 JavaScript 的这些知识。

  1. 函数是第一类对象,因此它们可以是对象的属性(在这种情况下它们被称为 方法) ,甚至是数组的元素。
  2. 如果不选择函数所属的对象,则它属于全局范围。在浏览器中,这意味着您将它挂在名为“ window”的对象上,这是全局变量所在的位置。
  3. 数组和对象是密切相关的。(有传言说,他们甚至可能是乱伦的结果!)通常可以使用点 .代替方括号 [],反之亦然。

你的问题是由于考虑了参考点方式而不是方括号方式的结果。

所以,为什么不说,

window["functionName"]();

这是在假设函数位于全局空间的前提下,如果已经有了名称空间,那么:

myNameSpace["functionName"]();

避免使用 eval,避免将字符串传递给 setTimeout 和 setInterval。我写了很多 JS,从来不需要 Eval。“需要”评估来自于对语言不够了解。您需要了解范围、上下文和语法。如果你在评估方面遇到困难,直接问——你会很快学会的。

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

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


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

因为 eval()就是 (咒语)

正如诺斯瑞德娜在我之前40秒说的那样,这是 >

一定要避免使用 eval来做类似的事情,否则你会暴露自己的 XSS (跨网站脚本)漏洞。

例如,如果你要使用这里提出的 eval解决方案,一个恶意用户可以发送一个链接到他们的受害者,看起来像这样:

Http://yoursite.com/foo.html?func=function(){alert(’im%20in%20teh%20codez’)

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

因此,确保从来没有从用户输入(以及查询字符串 id 中的任何内容被认为是用户输入)输入的 eval不受信任代码。您可以将用户输入作为指向函数的键,但是要确保,如果给定的字符串与对象中的键不匹配,则不执行任何操作。例如:

// 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对象中的任何内容,但是它不执行任何代码,那么这将失败。