Ответ 1
Если функция находится в глобальной области, вы можете получить ее с помощью объекта window:
var myFunc = window[myFuncName];
Как подключить событие к имени функции, которое я определил как строку?
Я использую Prototype.js, хотя это не Prototype-speficic.
$(inputId).observe('click', formData.fields[x].onclick);
Это приведет к тому, что JavaScript жалуется, что мой обработчик не является функцией. Я бы предпочел не использовать eval()
.
Если функция находится в глобальной области, вы можете получить ее с помощью объекта window:
var myFunc = window[myFuncName];
Я работал над этой проблемой, так как мне нужна была такая функция. Вот мой код песочницы, не полностью протестированный, но может стать отправной точкой для других. Обратите внимание, что в коде есть один 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');
... или это [myFuncName];
Может быть,?
setTimeout ( "myFunc()", 1 );
window.myFunction === window["myFunction"]
Похоже, что formData.fields[x].onclick
содержит имя глобальной функции? Если да, попробуйте:
$(inputId).observe('click', window[formData.fields[x].onclick]);
Просто eval
выполнит задание
var call = eval("method_name").call(args);
Знаете ли вы, что содержит свойство onclick или какой тип? Я предполагаю, что это прототип специфического материала, поскольку "поля" не существуют в формах DOM.
Если вам нужно вызвать строку с аргументами, сделайте следующее:
window[stringFunctionName].apply( window, arrayOfArguments )
Вы можете использовать scope
вместо window
, если предпочитаете
обновление: --- использовать экспорт и импорт 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]()
eval('str')
(устаревшая функция https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features)
setTimeout('str')
setInterval('str')
window['str']
(но... иногда глобальный объект не является окном)
new Function('str')
Эти методы выше всегда не рекомендуются по некоторым причинам, но они действительно удобны в использовании. Эти методы ниже безопасны, но на самом деле они не используются.
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