调用变量中命名的JavaScript函数
这个问题在这里已经有了答案:
我会避免评估。
为了解决这个问题,你应该知道关于JavaScript的这些东西。
.
而不是方括号[]
,反之亦然。 你的问题是考虑参考点方式而不是方括号方式的结果。
那么,为什么不喜欢,
window["functionName"]();
这是假设你的功能生活在全球空间。 如果你有命名空间,那么:
myNameSpace["functionName"]();
避免使用eval,并避免将字符串传入setTimeout和setInterval。 我写了很多JS,我从不需要评估。 “需要”评估来自于不够深入地了解语言。 您需要了解范围,上下文和语法。 如果你坚持使用eval,只需问 - 你会很快学会。
如果它在全球范围内,最好使用:
function foo()
{
alert('foo');
}
var a = 'foo';
window[a]();
比eval()
。 因为eval()
是evaaaaaal。
完全像诺斯瑞德娜在我之前40秒说的那样>。<
绝对避免使用eval
来做这样的事情,否则你会打开自己的XSS(跨站点脚本)漏洞。
例如,如果您要使用此处提出的eval
解决方案,恶意用户可能会向受害者发送链接,如下所示:
http://yoursite.com/foo.html?func=function(){alert('Im%20In%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
对象中的任何内容,但是它不会执行任何代码,这将失败。