Seeing as I hate eval, and I am not alone :(看到我讨厌eval,而我并不孤单 :)
var fn = window[settings.functionName];
if(typeof fn === 'function') {
fn(t.parentNode.id);
}
Edit: In reply to @Mahan's comment: In this particular case, settings.functionName
would be "clickedOnItem"
.(编辑:回复"clickedOnItem"
的评论:在这种特殊情况下, settings.functionName
将是"clickedOnItem"
。)
This would, at runtime translate var fn = window[settings.functionName];
(这将在运行时翻译var fn = window[settings.functionName];
) into var fn = window["clickedOnItem"]
, which would obtain a reference to function clickedOnItem (nodeId) {}
.(进入var fn = window["clickedOnItem"]
,它将获得对function clickedOnItem (nodeId) {}
的引用。) Once we have a reference to a function inside a variable, we can call this function by "calling the variable", ie fn(t.parentNode.id)
, which equals clickedOnItem(t.parentNode.id)
, which was what the OP wanted.(一旦我们在变量中引用了一个函数,我们可以通过“调用变量”来调用这个函数,即fn(t.parentNode.id)
,它等于clickedOnItem(t.parentNode.id)
,这就是OP通缉。)
More full example:(更完整的例子:)
/* 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);
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…