Как вызвать функцию из переменной?
Здравствуйте. Подскажите как вызвать функцию которая была присвоена переменной? Пробовал 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 все равно срабатывает. Как быть? |
// Сначала объявляется функция которая выводит сообщение, и выполняет какое либо действие при закрытии сообщения, если действие установлено function MessageBox(message, action) { $('.message').html(message).show(); if(action) action(); } function Func1() { // ... какие либо действия var action = function(){ alert(1); } MessageBox('Сообщение1', action); } // ... какие либо действия MessageBox('Сообщение1'); |
tsigel, а причем тут это? Я не понял, где у него глобальная переменная возникает, в каком месте?
|
sss2019 Короче, я думаю, что ничего там не "становится глобальной", не должно быть такого. Возможно у вас где-то определена уже ф-ция с именем action в глобале. Хотя, зачем Вам тут eval тоже не совсем понятно. Но эти вещи, по-моему, никак между собой не связаны.
|
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(); |
Тут все просто, это closures, а вот если по смыслу, то есть как вызвать функцию по имени в переменной - какие-то проблемы. Приходится рисовать объект={}; и только тогда после конкатенации, скажем m='valid_' + 'tel', можно запустить метод obj[m] // valid_tel.
А может быть есть способ по-другому и без window[m], поскольку window ничего не знает про кложи в кложе. |
kostyanet, остаётся только eval. А eval - это отключение большинства оптимизаций движка.
Передача имен функций текстом - говнокод само по себе. Нет ни одной причины делать так. tsigel тебе показал как надо делать. |
Цитата:
|
Часовой пояс GMT +3, время: 08:20. |