使用字符串调用JavaScript函数名称?

时间:2009-01-30 19:50:28

标签: javascript

如何将事件连接到我定义为字符串的函数名?

我正在使用Prototype.js,虽然这不是Prototype-speficic。

$(inputId).observe('click', formData.fields[x].onclick);

这会导致JavaScript抱怨我的处理程序不是函数。我不希望我们使用eval()

10 个答案:

答案 0 :(得分:81)

如果函数在全局范围内,您可以使用window对象获取它:

var myFunc = window[myFuncName];

答案 1 :(得分:9)

我已经解决了这个问题,因为我需要这样的功能。这是我的沙箱代码,没有经过全面测试,但可以成为其他人的起点。 请注意,代码中有一个eval(),因为我无法弄清楚如何绕过该步骤,可能是一个javascript怪癖,无法以任何其他方式完成。如果有办法摆脱eval(),请告诉我!

executeFunctionByName = function(functionName)
{
    var args = Array.prototype.slice.call(arguments).splice(1);
    //debug
    console.log('args:', args);

    var namespaces = functionName.split(".");
    //debug
    console.log('namespaces:', namespaces);

    var func = namespaces.pop();
    //debug
    console.log('func:', func);

    ns = namespaces.join('.');
    //debug
    console.log('namespace:', ns);

    if(ns == '')
    {
        ns = 'window';
    }

    ns = eval(ns);
    //debug
    console.log('evaled namespace:', ns);

    return ns[func].apply(ns, args);
}


core = {
    paragraph: {
        titlebar: {
            user: "ddd",
            getUser: function(name)
            {
                this.user = name;
                return this.user;
            }
        }
    }
}

var testf = function()
{
    alert('dkdkdkd');
}

var x = executeFunctionByName('core.paragraph.titlebar.getUser', 'Ikon');
executeFunctionByName('testf');

答案 2 :(得分:6)

...或者[myFuncName];

答案 3 :(得分:5)

也许?

setTimeout ( "myFunc()", 1 );

答案 4 :(得分:3)

window.myFunction === window["myFunction"]

答案 5 :(得分:3)

看起来formData.fields[x].onclick是否包含全局函数的名称?如果是这样,试试:

$(inputId).observe('click', window[formData.fields[x].onclick]);

答案 6 :(得分:3)

只需eval即可完成工作

var call = eval("method_name").call(args);

答案 7 :(得分:1)

你知道onclick属性包含什么或它是什么类型的?我认为这是原型特定的东西,因为DOM表单中不存在“字段”。

答案 8 :(得分:0)

如果需要使用参数调用字符串函数,请执行以下操作:

window[stringFunctionName].apply( window, arrayOfArguments )

如果愿意,您可以使用scope代替window

答案 9 :(得分:0)

更新:--- 使用ES6导出和导入

a.js

const fn = {
  aaa: function() {
    //code
  },
  bbb: function() {
    //code
  },
  //codes ....
  nnn: function() {
    //code
  }
}

export default fn

b.js

  import someFn from './a'
  //eg
  const str1='aaa'
  const str2 = 'bbb'

  someFn[str1]()

以上这些方法由于某些原因总是不推荐,但它们使用起来非常方便。 下面这些方法是安全的,但实际上并不便于使用。

  • 切换...案例(或者如果......其他)

    switch(str){
        case 'str1': 
            fn1()
            break
        case 'str2':
            fn2
            //and so on
    }
    
  • 将函数放入对象

    const fn={
        str1:fn1,
        str2:fn2
        //and so on
    }
    fn[str1] //call function