How to turn a String into a JavaScript function call?

This question already has an answer here:

  • How to execute a JavaScript function when I have its name as a string 29 answers

  • Seeing as I hate eval, and I am not alone:

    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" . This would, at runtime translate var fn = window[settings.functionName]; into var fn = window["clickedOnItem"] , which would obtain a reference to 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.

    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);
    }
    

    window[settings.functionName](t.parentNode.id);
    

    不需要eval()


    Here is a more generic way to do the same, while supporting scopes :

    // 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]];
    }
    

    Hope it can help some people out.

    链接地址: http://www.djcxy.com/p/94818.html

    上一篇: 调用变量中命名的JavaScript函数

    下一篇: 如何将字符串转换为JavaScript函数调用?