Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как вызвать функцию в виде строки + число?

Константин Ефименко Гуру (3721), закрыт 4 года назад
Мне необходимо вызывать функцию, по названию + изменяемое число. Вот небольшой пример как это сделать:

https://jsfiddle.net/fa513ejy/

Если исходить из этого примера, то у меня будут проблемы области видимости, ко всему прочему, на сколько я понимаю eval() является устаревшей функцией, которую не стоит применять.

Если написать new Function(), то конструктор мне сообщает, о том что для своей работы, он использует eval(). Вот и получается замкнутый круг.

Как мне вызвать функцию вида: название + изменяемое число?
Лучший ответ
Elepsis Eclipse Гений (64065) 4 года назад
Все функции можно хранить в объекте и передать куда надо. Но плохая идея... создавать кучу одинаковых функций. Можно же тот же 188 передать в качестве аргумента и как-то обрабатывать уже внутри функции.

https://jsfiddle.net/OPTlMUS/mes9cf1q/
Константин ЕфименкоГуру (3721) 4 года назад
Этого будет более чем достаточно, я не хочу проверять функцию на - "работает/не работает":

$(document).ready(function() {
var funcs = new Methods();
$('.btn').on('click', function() {
var num = 188,
func = funcs["filOrdFin" + num];
func();
});
});

function Methods()
{
var block = $('.result h1'),
count = 0;
this.filOrdFin188 = function()
{
block.text(`Ты нажал ${++count} раз`);
}
}

Тем не менее, такой способ работает только при условии, что я буду все именованные функции запускать внутри одного метода - Methods(). Но мне необходимо подгружать функции из разных файлов, обращаясь одному и тому же методу.

Как быть? Полагаю нужен цикл, чтобы пройтись по всем методам или что-то вроде того. Не представляю как это будет выглядеть...
Константин ЕфименкоГуру (3721) 4 года назад
При помощи этого кода, я вывел список всех функций документа:

obj = {
a: function(){
(function(global){console.log(global)})(Function('return this;')());
}
}
obj.a();

Этот эксперимент показал, что сколько бы я методов не объявил, одновременно виден будет лишь один из них. Но стоило мне в одном из файлов, сменить название метода, просто добавив цифру, он тут же появился в списке.

Это говорит о том, что в таком виде, будет невозможно пройтись циклом по всем методам. Можно ли как то, вызывать эти именованные функции из разных файлов (и соответственно скриптов)?
Константин ЕфименкоГуру (3721) 4 года назад
Вообщем я решил остановиться на этом варианте:

FilOrdFin188 = function(Pr1, Pr2, Pr3){}

eval('FilOrdFin'+Num+'(Pr1, Pr2, Pr3);');

Проблем с неработающими переменными не наблюдаю. В любом случае, спасибо за ваше решение, очень схоже с принципами построения плагина.
Остальные ответы
Mr. Someone Мудрец (13651) 4 года назад
// function we want to run

var fnstring = "runMe";

// find object

var fn = window[fnstring];

// is object a function?

if (typeof fn === "function") fn();

----

Нашел тут https://www.sitepoint.com/call-javascript-function-string-without-using-eval/

Попробуй и скажи, что получилось, самому интересно)
Константин ЕфименкоГуру (3721) 4 года назад
Я перед этим пробовал, ничего не происходит. А если в jsfiddle не робит, у меня и подавно не будет.
Mr. Someone Мудрец (13651) Сам попробовал. Работает.
Саня Семенов Оракул (60424) 4 года назад
Не стоит применять eval не потому что это функция плохая и для неё есть более новый аналог а потому что подход к проектированию архитектуры программы при котором необходимо использовать функцию eval - хреновый т е создавать стопицот функций с цифрами в названии - откровенно говнокод
Константин ЕфименкоГуру (3721) 4 года назад
"Не стоит применять eval не потому что это функция плохая и для неё есть более новый аналог"

Да ты что, почему же в интернете ровно ноль информации о том, что вообще есть новый аналог. Покажите мне его, если это в действительности так, и это не просто шаблонная диванная критика не подкреплённая никакими фактами, и действиями с вашей стороны!!!

"создавать стопицот функций с цифрами в названии - откровенно говнокод"

Полностью поддерживаю, эта концепция была предложена 3 людьми шаблонизаторами, которые хотят сами писать скрипты и контент, чтобы всё было пронумеровано и разделено на шаблоны. Таким образом, если что-то изменится в контенте, можно будет изменить и контент, и сам скрипт (скрипт не однозначный и тоже изменится), т. к. он будет уже вынесен в отдельный шаблон.
Похожие вопросы