Подтвердить что ты не робот

Вызывать имя функции JavaScript с помощью строки?

Как подключить событие к имени функции, которое я определил как строку?

Я использую Prototype.js, хотя это не Prototype-speficic.

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

Это приведет к тому, что JavaScript жалуется, что мой обработчик не является функцией. Я бы предпочел не использовать eval().

4b9b3361

Ответ 1

Если функция находится в глобальной области, вы можете получить ее с помощью объекта window:

var myFunc = window[myFuncName];

Ответ 2

Я работал над этой проблемой, так как мне нужна была такая функция. Вот мой код песочницы, не полностью протестированный, но может стать отправной точкой для других. Обратите внимание, что в коде есть один 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');

Ответ 3

... или это [myFuncName];

Ответ 4

Может быть,?

setTimeout ( "myFunc()", 1 );

Ответ 5

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

Ответ 6

Похоже, что formData.fields[x].onclick содержит имя глобальной функции? Если да, попробуйте:

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

Ответ 7

Просто eval выполнит задание

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

Ответ 8

Знаете ли вы, что содержит свойство onclick или какой тип? Я предполагаю, что это прототип специфического материала, поскольку "поля" не существуют в формах DOM.

Ответ 9

Если вам нужно вызвать строку с аргументами, сделайте следующее:

window[stringFunctionName].apply( window, arrayOfArguments )

Вы можете использовать scope вместо window, если предпочитаете

Ответ 10

обновление: --- использовать экспорт и импорт 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... case (или if... else)

    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