JSON-Zeichenfolgen auswerten - eval () und neue Funktion () [duplizieren]

9

Gibt es bei einer Zeichenfolge , die eine gültige JSON-Zeichenfolge darstellt , einen Unterschied zwischen diesen beiden Analysemethoden:

%Vor%

Ich habe festgestellt, dass jQuery die zweite Methode verwendet, um JSON-Zeichenfolgen zu parsen (in Umgebungen, in denen ein integrierter JSON-Parser fehlt). Ich frage mich, warum sie nicht die erste Methode verwenden. Warum erstellen Sie ein Funktionsobjekt und rufen es auf, wenn Sie einfach eval() verwenden?

Bitte schließen Sie als genaues Duplikat

    
Šime Vidas 22.11.2011, 16:43
quelle

3 Antworten

3

eval wird innerhalb des Gültigkeitsbereichs ausgeführt, in dem es deklariert wurde. Function erzeugt ein neues Funktionsobjekt mit einem eigenen Gültigkeitsbereich und gibt einen Verweis auf diese Funktion zurück, die aufgerufen werden kann.

Nehmen Sie dieses Beispiel:

%Vor%

Die ersten beiden Funktionsaufrufe werden 123 (der globale Wert von x ) und undefined , der globale Wert von y , ausgeben.

Die beiden Funktionen eval drucken 123 und 1 (der lokale Wert von y ). Dies liegt daran, dass eval lokalen Zugriff auf die Schließung hat, in der es ausgeführt wird. Diese Verhaltensweisen (sowie die Tatsache, dass eval völlig unzuverlässig ist und inkonsistent über viele Browser hinweg) könnte von der jQuery-Implementierung ausgenutzt werden.

Hinweis: Code oben in Firefox 8 getestet, Ihre Laufleistung kann variieren:)

    
Mike Christensen 22.11.2011 16:47
quelle
2

Die Verwendung von eval ist böse, weil es viele Sicherheitslücken geben kann. Sie führen Code im globalen Gültigkeitsbereich aus. Function nimmt dies anders, indem es in seinem eigenen Umfang ausführt. Aber eine Sache Function ist besser Leistung. Schauen Sie sich dieses Blog an zeigt, dass Function in FF2 fast 2x schneller ist.

Bearbeiten: Ich bin nicht sicher, wie viel sicherer es ist, wenn Sie document.location = "bad-url" ausführen, es würde immer noch mit Function

ausgeführt werden     
Amir Raminfar 22.11.2011 16:48
quelle
0

Der globale Umfang Sache und auch es wird nichts nach einem ";" Wegen der return hilft das ein lil-Bit.

    
Delta 22.11.2011 16:50
quelle

Tags und Links