nodejs - альтернатива eval javascript




Являются ли eval() и new Function() одинаковыми? (4)

Эти две функции делают то же самое за кулисами? (в одиночных операциях)

var evaluate = function(string) {
    return eval('(' + string + ')');
}

var func = function(string) {
    return (new Function( 'return (' + string + ')' )());
}

console.log(evaluate('2 + 1'));
console.log(func('2 + 1'));

В этом примере результаты одинаковы, да. Оба выполняют переданное вами выражение. Это делает их настолько опасными.

Но они многое делают позади. Тот, который включает new Function() , за кадром, создает анонимную функцию из кода, который вы поставляете, который выполняется при вызове функции.

JavaScript, который вы передаете ему, технически не выполняется, пока вы не вызываете анонимную функцию. Это контрастирует с eval() который сразу же выполняет код и не генерирует на нем функцию.


Если вы имеете в виду, он даст те же результаты, то да ... но просто для eval (иначе, «оцените эту строку JavaScript») было бы намного проще.

EDIT Ниже:

Это как сказать ... эти две математические проблемы одинаковы:

1 + 1

1 + 1 + 1 - 1 + 1 - 1 * 1/1


Нет.

В вашем обновлении вызовы для evaluate и func дают одинаковый результат. Но они определенно не «делают то же самое за кулисами». Функция func создает новую функцию, но затем сразу же выполняет ее, тогда как функция evaluate просто выполняет код на месте.

Из оригинального вопроса:

var evaluate = function(string) {
    return eval(string);
}
var func = function(string) {
    return (new Function( 'return (' + string + ')' )());
}

Это даст вам очень разные результаты:

evaluate('0) + (4');
func('0) + (4');

Просто хочу указать некоторый синтаксис, используемый в примерах здесь, и что это означает:

 var func = function(string) {
     return (new Function( 'return (' + string + ')' )());
 }

обратите внимание, что функция (...) () имеет «()» в конце. Этот синтаксис вызовет func для выполнения новой функции и возвращает строку, а не функцию, возвращающую строку, но если вы используете следующее:

 var func = function(string) {
     return (new Function( 'return (' + string + ')' ));
 }

Теперь func вернет функцию, которая возвращает строку.







eval