Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вызов функции через переменную (https://javascript.ru/forum/misc/55588-vyzov-funkcii-cherez-peremennuyu.html)

iNfantry 05.05.2015 16:43

Вызов функции через переменную
 
Всем привет, не могу понять как сделать простейшую вещь - вызвать функцию через переменную по аналогии с пхп.
Например у меня есть функция my_func() и я хочу присвоить ее имя переменной fn_name = 'my_func'; и вызвать fn_name.apply(this, '123'), но мне пишет что в fn_name - не функция, как это делается в яваскрипте самым простым способом?

vasa_c 05.05.2015 16:57

Зачем? Поместите в переменную саму функцию, а не имя.

Safort 05.05.2015 17:30

function my_func() {
alert('lala');
}
var fn_name = 'my_func';
window[fn_name]();

Decode 05.05.2015 17:32

function myFunc() {
  alert(this);
}

var fnName = myFunc;

fnName.call(123);

iNfantry 06.05.2015 01:29

Safort, большое спасибо, то что надо!
vasa_c, дело в том, что имя функции генерится динамически.
Кстати, я еще один способ нашел - просто через eval().

vasa_c 06.05.2015 07:54

Ну, вот, дали человеку решение в лоб, теперь он будет фигнёй маятся, вместо того, чтобы подумать.

Erolast 06.05.2015 11:02

Цитата:

vasa_c, дело в том, что имя функции генерится динамически.
Херня. Так не должно быть.

iNfantry 08.05.2015 17:35

Цитата:

Сообщение от vasa_c (Сообщение 369599)
Ну, вот, дали человеку решение в лоб, теперь он будет фигнёй маятся, вместо того, чтобы подумать.

О чем подумать? Что не так?

Erolast 08.05.2015 19:38

Хотя бы о том, что использование эвала исключает любые оптимизации кода интерпретатором.

Цитата:

имя функции генерится динамически
Зачем?

iNfantry 11.05.2015 14:24

Цитата:

Сообщение от Erolast (Сообщение 369967)
Зачем?

Допустим есть несколько однотипных функций funcA, funcB и funcC, вместо кучи ифов удобно использовать сразу вызов нужного имени. Это плохо?

Safort 11.05.2015 15:12

iNfantry,
скажем так, это не очень хорошо.

eval() нельзя использовать в strict mode.
И если у тебя есть однотипные функции, то можно запихнуть их в объект, это будет удобнее и в глобальное пространство имён мусорить не будешь.
var obj = {
  funcA: function() {},
  funcB: function() {},
  funcC: function() {},
};

//вызов
obj['funcA']();
//или так, если заранее знаешь имя
obj.funcA();

Erolast 11.05.2015 16:55

Цитата:

И если у тебя есть однотипные функции, то можно запихнуть их в объект, это будет удобнее и в глобальное пространство имён мусорить не будешь.
Аха, но я бы лучше сделал так:
var functions = {
  A: function() {},
  B: function() {},
  C: function() {}
};

functions["A"]();
functions["B"]();


Цитата:

Это плохо?
Да, потому что грязный хак. Банально - как это код будет минифицироваться и оптимизироваться?

Erolast 11.05.2015 17:00

Цитата:

eval() нельзя использовать в strict mode.
Почему? Вполне можно.
"use strict";

console.log(eval("1 + 1"));


Другое дело, что единственный кейс, где он должен применяться - это выполнение произвольного кода.

Safort 11.05.2015 17:10

Цитата:

Сообщение от drDocument (Сообщение 370245)
то есть, первый вариант можно использовать если не знаешь имени?

Да. В первом варианте показан пример обращения к свойству-функции через литерал строки. Ясно-понятно, что её можно динамически генерировать.

Safort 11.05.2015 17:13

Erolast,
Цитата:

Аха, но я бы лучше сделал так:
Согласен. Я просто показал ТС пример для его варианта.

Цитата:

Почему? Вполне можно.
Сорян братух, попутал берега ;(

iNfantry 11.05.2015 20:07

Да, про евал я понял, он мне и самому не нравится, а насчет списка функций да, согласен, что лучше какой-то промежуточный контейнер с этими функциями вместо глобального window. Именно этот вариант я и выбираю, всем спасибо)


Часовой пояс GMT +3, время: 18:28.