如何将字符串转换为JavaScript函数调用?

这个问题在这里已经有了答案:

  • 当我的名字作为字符串29答案时如何执行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

    上一篇: How to turn a String into a JavaScript function call?

    下一篇: Git replace master branch with another branch