console.log() возвращает undefined, когда я указываю функцию в качестве ее аргумента

#javascript #jquery #function #return-value

#javascript #jquery #функция #возвращаемое значение

Вопрос:

Я пытаюсь создать сайт для студентов, который позволит им вводить javascript, запускать код и проверять код на соответствие ожидаемым результатам. У меня возникли небольшие проблемы с использованием конструктора Function() для запуска кода, который я получаю из пространства ввода текста.

Для запуска submitcode() нажимается кнопка

   function submitcode(){
    $(document).find('textarea,:text').each( function(){
      var codewritten = $(this).val();
      console.log(codewritten);
      test(codewritten);
    });
  }
 

метод тестирования здесь:

   function test(inputcode){
    var passed = inputcode; //code that they wrote
    var args = 'pogchamp'; //this is my input that i want to test their code with
    var f = new Function('a',passed);
    console.log(passed);
    console.log('test');
    console.log(f(args));
  }
 

Когда я проверяю вывод Chrome, переданное значение отображается правильно, как и ‘test’, в то время как console.log(f(args)); возвращает значение undefined.

Вот примерное значение переданной переменной, просто для справки:

    function foo(str){
       return false; //auto-generated
   }
 

Спасибо и извините (я относительно новичок в javascript)

Комментарии:

1. Не новая функция! только передано (аргументы)! переданный уже является функцией. кстати, ссылка на функцию.

2. не передается ли переменная, содержащая значение параметра, предоставленного test() ?

3. Извините, я неправильно понял ваш snipped . Возвращает ли определенный пользователем код что-то? Потому что, если нет, вы получаете undefined вместо возвращаемого значения.

Ответ №1:

new Function() создает новую функцию с заданным содержимым. Вы передаете ему объявление функции, поэтому результирующая функция выглядит следующим образом:

 function( a ) {
    function foo(str){
        return false; //auto-generated
    }
}
 

…который при вызове ничего не возвращает. (Вы можете подтвердить это с console.log(f.toString()) помощью ).

Чтобы исправить это, вы можете использовать eval() вместо:

 eval( "var f = "   passed );
 

Ко всем неизбежным комментариям «eval — это зло !!»: это один из редких случаев, когда eval на самом деле является подходящим выбором. new Function() также оценивается другим именем. И, конечно, вам нужно хотя бы попробовать ..catch вокруг него, чтобы поймать синтаксические ошибки во входных данных.

Комментарии:

1. просто чтобы убедиться, что я понимаю: eval( «var f = » передано); сопоставит var f с функцией (как указано в передано). Затем я мог бы вызвать console.log(f(‘fooinput’)); и это вернет что-то понятное, верно?

2. @NelsonLiu Да! Пока код, который вы оцениваете, понятен 🙂

Ответ №2:

Вот Function() конструктор:

 new Function ([arg1[, arg2[, ...argN]],] functionBody);
 

Проблема с вашим кодом связана с телом функции. Похоже, что для предоставленного вами примера это то, что приведет:

 (function( a ) {
    function foo(str) {
        return false;
    }
})( args );
 

Который правильно возвращает undefined, потому что внешняя функция ничего не возвращает, хотя внутренняя возвращает.

Демонстрация JSFIDDLE

В приведенном здесь примере тело функции не должно быть функцией, если вы не планируете вызывать ее внутри внешней (новой функции):

Демонстрация JSFIDDLE

// Пример может быть запущен непосредственно в вашей консоли JavaScript

// Создайте функцию, которая принимает два аргумента и возвращает сумму этих аргументов var adder = new Function(«a», «b», «return a b»);

// Вызов функции сумматора(2, 6); // > 8