97 votes

Eval () et new Function () sont-ils la même chose?

Ces deux fonctions font-elles la même chose en coulisse? (dans les fonctions à instruction unique)

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

124voto

PleaseStand Points 16718

Non, ce ne sont pas les mêmes.

  • eval() évalue une chaîne de caractères comme une expression JavaScript dans le courant de l'étendue d'exécution et peut accéder aux variables locales.
  • new Function() analyse le code JavaScript stockées dans une chaîne de caractères dans un objet de fonction, qui peut être appelé. Il ne peut pas accéder aux variables locales, car le code s'exécute dans une autre portée.

Considérer ce code:

function test1() {
    var a = 11;
    eval('(a = 22)');
    alert(a);            // alerts 22
}

Si new Function('return (a = 22);')() ont été utilisés, la variable locale a serait de conserver sa valeur. Néanmoins, certains programmeurs JavaScript tels que Douglas Crockford croire qu' aucun des deux ne doit être utilisé , sauf si absolument nécessaire, et evaling/à l'aide de l' Function constructeur sur les données non fiables est dangereux et imprudent.

6voto

palswim Points 4353

Pas de.

Dans votre mise à jour, les appels à l' evaluate et func produisent le même résultat. Mais, ils sont très certainement pas "faire la même chose derrière les coulisses". L' func fonction crée une nouvelle fonction, mais alors immédiatement l'exécute, tandis que l' evaluate fonction exécute simplement ce code sur le spot.

À partir de la question d'origine:

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

Cela vous donnera des résultats très différents:

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

6voto

Juan Mendes Points 31678

new Function crée une fonction qui peut être réutilisé. eval seulement s'exécute dans la chaîne et renvoie le résultat de la dernière instruction. Votre question est hors de propos que vous avez tenté de créer une fonction wrapper qui utilise la Fonction pour émuler un eval.

Est-il vrai qu'ils partagent un peu de code derrière les rideaux? Oui, très probablement. Exactement le même code? Non, certainement.

Pour le plaisir, voici mon propre imparfaite de la mise en œuvre à l'aide de la fonction eval pour créer une fonction. Espérons qu'il jette un peu de lumière dans la différence!

function makeFunction() {
  var params = [];
  for (var i = 0; i < arguments.length -  1; i++) {
    params.push(arguments[i]);
  }
  var code = arguments[arguments.length -  1];


 // Creates the anonymous function to be returned
 // The following line doesn't work in IE
 // return eval('(function (' + params.join(',')+ '){' + code + '})');
 // This does though
 return eval('[function (' + params.join(',')+ '){' + code + '}][0]');
}

La plus grande différence entre cela et une Fonction nouvelle, c'est que la Fonction n'est pas lexicalement étendue. Donc il n'ont pas accès à la fermeture des variables et de la mine.

2voto

Timothy Khouri Points 14640

Si vous voulez dire, cela donnera-t-il les mêmes résultats, alors oui ... mais juste pour eval (alias "évaluer cette chaîne de JavaScript") serait beaucoup plus simple.

EDIT ci-dessous:

C'est comme dire ... ces deux problèmes de maths sont-ils les mêmes:

1 + 1

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

1voto

Chris Laplante Points 18060

Dans cet exemple, les résultats sont les mêmes, oui. À la fois exécuter l'expression que vous avez pass. C'est ce qui les rend si dangereux.

Mais ils font des choses différentes derrière le scense. L'un impliquant new Function(), derrière-le-scènes, crée une fonction anonyme du code de l'offre, qui est exécutée lorsque la fonction est appelée.

Le code JavaScript que vous transmettez est techniquement pas exécutée jusqu'à ce que vous appelez la fonction anonyme. Ceci est en contraste à l' eval() qui exécute le code tout de suite, et ne génère pas une fonction sur la base.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X