如何将字符串转换为JavaScript函数调用?
这个问题在这里已经有了答案:
看到我讨厌eval,我并不孤单:
var fn = window[settings.functionName];
if(typeof fn === 'function') {
fn(t.parentNode.id);
}
编辑:在回复@ Mahan的评论:在这种特殊情况下, settings.functionName
将是"clickedOnItem"
。 这会在运行时翻译var fn = window[settings.functionName];
到var fn = window["clickedOnItem"]
,它将获得对function clickedOnItem (nodeId) {}
的引用。 一旦我们有了一个变量内的函数的引用,我们可以通过“调用变量”来调用这个函数,即fn(t.parentNode.id)
,它等于clickedOnItem(t.parentNode.id)
,这就是OP通缉。
更完整的例子:
/* Somewhere: */
window.settings = {
/* [..] Other settings */
functionName: 'clickedOnItem'
/* , [..] More settings */
};
/* Later */
function clickedOnItem (nodeId) {
/* Some cool event handling code here */
}
/* Even later */
var fn = window[settings.functionName];
/* note that settings.functionName could also be written
as window.settings.functionName. In this case, we use the fact that window
is the implied scope of global variables. */
if(typeof fn === 'function') {
fn(t.parentNode.id);
}
window[settings.functionName](t.parentNode.id);
不需要eval()
这是一个更通用的方式来做同样的事情,同时支持范围:
// Get function from string, with or without scopes (by Nicolas Gauthier)
window.getFunctionFromString = function(string)
{
var scope = window;
var scopeSplit = string.split('.');
for (i = 0; i < scopeSplit.length - 1; i++)
{
scope = scope[scopeSplit[i]];
if (scope == undefined) return;
}
return scope[scopeSplit[scopeSplit.length - 1]];
}
希望它可以帮助一些人。
链接地址: http://www.djcxy.com/p/94817.html