Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.09.2014, 16:53
Аспирант
Отправить личное сообщение для sss2019 Посмотреть профиль Найти все сообщения от sss2019
 
Регистрация: 15.06.2010
Сообщений: 41

Как вызвать функцию из переменной?
Здравствуйте. Подскажите как вызвать функцию которая была присвоена переменной? Пробовал 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 все равно срабатывает.

Как быть?
Ответить с цитированием
  #2 (permalink)  
Старый 01.09.2014, 16:54
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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

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

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

	MessageBox('Сообщение1');
Ответить с цитированием
  #3 (permalink)  
Старый 02.09.2014, 02:59
Аспирант
Посмотреть профиль Найти все сообщения от petya
 
Регистрация: 02.09.2014
Сообщений: 77

tsigel, а причем тут это? Я не понял, где у него глобальная переменная возникает, в каком месте?
Ответить с цитированием
  #4 (permalink)  
Старый 02.09.2014, 03:24
Аспирант
Посмотреть профиль Найти все сообщения от petya
 
Регистрация: 02.09.2014
Сообщений: 77

sss2019 Короче, я думаю, что ничего там не "становится глобальной", не должно быть такого. Возможно у вас где-то определена уже ф-ция с именем action в глобале. Хотя, зачем Вам тут eval тоже не совсем понятно. Но эти вещи, по-моему, никак между собой не связаны.
Ответить с цитированием
  #5 (permalink)  
Старый 02.09.2014, 09:12
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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();

Последний раз редактировалось tsigel, 02.09.2014 в 09:23.
Ответить с цитированием
  #6 (permalink)  
Старый 02.09.2014, 10:51
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

А может быть есть способ по-другому и без window[m], поскольку window ничего не знает про кложи в кложе.
Ответить с цитированием
  #7 (permalink)  
Старый 02.09.2014, 11:18
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

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

tsigel тебе показал как надо делать.
__________________
29375, 35

Последний раз редактировалось Aetae, 02.09.2014 в 11:20.
Ответить с цитированием
  #8 (permalink)  
Старый 02.09.2014, 13:34
Аспирант
Отправить личное сообщение для sss2019 Посмотреть профиль Найти все сообщения от sss2019
 
Регистрация: 15.06.2010
Сообщений: 41

Сообщение от tsigel Посмотреть сообщение
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(). Это я и хотел узнать, спасибо
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как Emberjs рендерит шаблон по переменной {{outlet}} без перезагрузки родителя Chifu Библиотеки/Тулкиты/Фреймворки 2 10.10.2013 13:48
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
как реализовать передачу функции в функцию?? czp Общие вопросы Javascript 10 29.11.2011 19:21
Как вызвать внутреннюю функцию? KamalovRadik jQuery 1 19.11.2011 02:03
[Closure Compiler] Как запретить инлайнить функцию, которая вызывается из setTimeout? xintrea Events/DOM/Window 4 11.02.2011 16:23