За последние 24 часа нас посетили 20862 программиста и 1010 роботов. Сейчас ищут 367 программистов ...

Как вызвать функцию из строки ?

Тема в разделе "JavaScript и AJAX", создана пользователем Khaybulla, 13 дек 2019.

Метки:
  1. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    В данный момент использую такой код, но говорят что функцию eval использовать не безопасно, предложите аналоги или как вообще нужно реализовывать такое.

    Код (Javascript):
    1. let loginForm = {
    2.    
    3.         'email' : function() {
    4.             alert('123');
    5.         }
    6.  
    7. };
    8.  
    9. $('input').blur(function() {
    10.  
    11.         const element = $(this).attr('id');
    12.         const form = $(this).closest('form').attr('id');
    13.         const func = form + '.' + element + '()';
    14.  
    15.         eval(func);
    16.  
    17. });
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Khaybulla, например, использовать new Function
    Код (Javascript):
    1. new Function('',func)();
     
    Khaybulla нравится это.
  3. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Пробовал уже когда вписываю сразу функцию то работает а если переменную где генерируется название функции не работает.


    Код (Javascript):
    1. new Function(loginForm.email()); //работает
    2.  
    3. new Function(func); // не работает
     
  4. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Он добавляет значение переменной туда как строку string а нужно как то обозначить или дать понять что это function
     
  5. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Khaybulla, приглядись к спойлеру. У new Function() - два параметра. Первый - аргументы, передаваемые в функцию (у нас - пустая строка), второй - имя функции (у нас - func). И не забудь скобочки после вызова new Function и перед точкой с запятой.
    --- Добавлено ---
    Потому что явно вызывается функция liginForm.email() перед выполнением new Function()
    То есть, не работает :)
     
    Khaybulla нравится это.
  6. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Вставил твой вариант со спойлера выдало ошибку "Uncaught TypeError: loginForm.email is not a function" что такой функции нет
     
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Khaybulla, что-то не так вставил, однако. Я ведь проверил работоспособность варианта :)
     
    Khaybulla нравится это.
  8. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Код (Javascript):
    1. let loginForm = {
    2.  
    3.        'email' : function() {
    4.             alert('123');
    5.        }
    6.  
    7. };
    Может из того что объект из функций хотя когда делаю просто функцию тоже не работает ошибку дает что не определена функция
    --- Добавлено ---
    Код (Javascript):
    1. let loginForm = {
    2.        'email' : function() {
    3.             alert('123');
    4.        }
    5. };
    6.  
    7.  
    8. $('input').blur(function() {
    9.  
    10.         const element = $(this).attr('id');
    11.         const form = $(this).closest('form').attr('id');
    12.         const func = form + '.' + element + '()';
    13.        
    14.         new Function('', func)();
    15.  
    16.         // eval(func);
    17.  
    18.     });
    В данный момент код выглядит так пишет что такой функции нет, переменная func дает строку - loginForm.email()
     
  9. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Khaybulla, глянь для начала простой пример:
    HTML:
    1. <!doctype html>
    2. </head>
    3. let loginForm = {
    4.     'email' : function() {
    5.         console.log('12333');
    6.     }
    7. };
    8. const element = 'email';
    9. const form = 'loginForm';
    10. const func = form + '.' + element + '()';
    11. //console.log(func);
    12. new Function('',func)();
    13. </body>
    14. </html>
    Есть ещё вариант - "спрятать" формы в объект и использовать скобочки квадратные для доступа к элементам объекта:
    HTML:
    1. <!doctype html>
    2. </head>
    3. let obj = {
    4.   loginForm : {
    5.     'email' : function() {
    6.         console.log('12333');
    7.     }
    8.   }
    9. };
    10. const element = 'email';
    11. const form = 'loginForm';
    12. obj[form][element]();
    13. </body>
    14. </html>
     
    Khaybulla нравится это.
  10. Khaybulla

    Khaybulla Активный пользователь

    С нами с:
    4 мар 2016
    Сообщения:
    89
    Симпатии:
    2
    Первый вариант также ошибку выдает, а второй работает немного структуру переделал и так даже лучше теперь.
    Спасибо большое, за то что время уделил и помог!