Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как вызвать функцию из переменной? (https://javascript.ru/forum/misc/49871-kak-vyzvat-funkciyu-iz-peremennojj.html)

sss2019 01.09.2014 16:53

Как вызвать функцию из переменной?
 
Здравствуйте. Подскажите как вызвать функцию которая была присвоена переменной? Пробовал eval, но по моему эта переменная становится глобальной. Сейчас покажу что происходит в коде.

У меня был примерно такой код

// Сначала объявляется функция которая выводит сообщение, и выполняет какое либо действие при закрытии сообщения, если действие установлено
function MessageBox(message, action)
{
	$('.message').html(message).show();
	if(typeof action != 'undefined') eval(action)();
}

function Func1()
{
	// ... какие либо действия
	var action = function(){ alert(1); }
	MessageBox('Сообщение1', action);
}

// ... какие либо действия

	MessageBox('Сообщение1');


Если мы сначала при выполнении вызываем функцию Func1, то она задает переменную action которая вызывает алерт.

Но дальше просто вызывается функция MessageBox, без присваивания action. Но этот action все равно срабатывает.

Как быть?

tsigel 01.09.2014 16:54

// Сначала объявляется функция которая выводит сообщение, и выполняет какое либо действие при закрытии сообщения, если действие установлено
function MessageBox(message, action)
{
	$('.message').html(message).show();
	if(action) action();
}

function Func1()
{
	// ... какие либо действия
	var action = function(){ alert(1); }
	MessageBox('Сообщение1', action);
}

// ... какие либо действия

	MessageBox('Сообщение1');

petya 02.09.2014 02:59

tsigel, а причем тут это? Я не понял, где у него глобальная переменная возникает, в каком месте?

petya 02.09.2014 03:24

sss2019 Короче, я думаю, что ничего там не "становится глобальной", не должно быть такого. Возможно у вас где-то определена уже ф-ция с именем action в глобале. Хотя, зачем Вам тут eval тоже не совсем понятно. Но эти вещи, по-моему, никак между собой не связаны.

tsigel 02.09.2014 09:12

sss2019, вообще то если у функции объявлен аргумент, то даже если в него пришло undefined, то к глобальной переменной доступа не будет.

var action = function () {alert(1)};

var message = function (text, action) {

   if (action) {
      action();
   }

};

var f1 = function () {

   var action = function () {alert(2)};

   message("trololo");

   message("trololo", action);

};

message("trololo");

f1();

kostyanet 02.09.2014 10:51

Тут все просто, это closures, а вот если по смыслу, то есть как вызвать функцию по имени в переменной - какие-то проблемы. Приходится рисовать объект={}; и только тогда после конкатенации, скажем m='valid_' + 'tel', можно запустить метод obj[m] // valid_tel.

А может быть есть способ по-другому и без window[m], поскольку window ничего не знает про кложи в кложе.

Aetae 02.09.2014 11:18

kostyanet, остаётся только eval. А eval - это отключение большинства оптимизаций движка.
Передача имен функций текстом - говнокод само по себе. Нет ни одной причины делать так.

tsigel тебе показал как надо делать.

sss2019 02.09.2014 13:34

Цитата:

Сообщение от tsigel (Сообщение 328538)
sss2019, вообще то если у функции объявлен аргумент, то даже если в него пришло undefined, то к глобальной переменной доступа не будет.

var action = function () {alert(1)};

var message = function (text, action) {

   if (action) {
      action();
   }

};

var f1 = function () {

   var action = function () {alert(2)};

   message("trololo");

   message("trololo", action);

};

message("trololo");

f1();

А так проще было делать не eval(action)() а просто action(). Это я и хотел узнать, спасибо


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