我有一个 JavaScript 变量,其中包含一个 JavaScript 函数的名称。该函数通过使用 $.ajax 等加载和放置而存在于页面上。
谁能告诉我如何调用变量中命名的 javascript 函数?
函数的名称在一个变量中,因为用于加载页面片段(插入到当前页面)的 URL 包含要调用的函数的名称。
我愿意接受有关如何实施此解决方案的其他建议。
我有一个 JavaScript 变量,其中包含一个 JavaScript 函数的名称。该函数通过使用 $.ajax 等加载和放置而存在于页面上。
谁能告诉我如何调用变量中命名的 javascript 函数?
函数的名称在一个变量中,因为用于加载页面片段(插入到当前页面)的 URL 包含要调用的函数的名称。
我愿意接受有关如何实施此解决方案的其他建议。
我会避免评估。
要解决这个问题,你应该了解 JavaScript 的这些东西。
.
代替方括号[]
,反之亦然。您的问题是考虑点引用方式而不是方括号方式的结果。
那么,为什么不喜欢这样的东西,
window["functionName"]();
那是假设您的函数存在于全局空间中。如果您已命名空间,则:
myNameSpace["functionName"]();
避免使用 eval,并避免将字符串传入 setTimeout 和 setInterval。我写了很多 JS,我从不需要 eval。“需要” eval 来自对语言的了解不够深入。您需要了解范围、上下文和语法。如果你曾经被 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
对象中的任何内容,这将失败,但它不会执行任何代码。
这有点难看,但这是我脑海中浮现的第一件事。这也应该允许您传入参数:
eval('var myfunc = ' + variable); myfunc(args, ...);
如果您不需要传入参数,这可能会更简单。
eval(variable + '();');
适用标准干码警告。