2017-03-13 1 views
1

Wenn ich dies tun:Warum JS eval() geben nur den Wert eines Objekts

var x = eval('{a:"b"}); 
console.log(x); // -> "b" 

alles, was ich ist der Wert in dem Objekt zu erhalten („b“), nicht der Schlüssel/Eigentum oder das ganze Objekt selbst, das ist komisch.

aber wenn ich dies tun:

var x = eval('(function self(){return {a:"b"}})()'); 
console.log('x'); // -> {a:'b'} 

jetzt scheint es mir zu geben, was ich erwarten würde, das ganze Objekt. Aber warum ist das? Warum muss ich es in eine (selbstausführende) Funktion einbinden?

Ich denke Eval verwenden, um einige Objekte aus Strings zu erstellen, aber müssen besser wissen, wie das funktioniert.

Antwort

3

Das ist, weil {a:"b"} Anweisung, wie sie ist stellt die folgenden:

  1. A Code block begrenzt durch { ... }
  2. A labela:
  3. A Stringliteral "b"

wobei letztere die Nur Ausdruck erzeugt das Ergebnis.

Und das gleiche im AST-Explorer: https://astexplorer.net/#/gist/909bebf...

ein Objekt zurückgeben Sie es in einen Ausdruck drehen müssen zuerst, wie: wickeln Sie es in Klammern: eval('({a:"b"})')

Aber die ganze Idee von „I Ich denke, Eval zu verwenden, um einige Objekte aus Strings zu erstellen "klingt verdächtig.

+0

Ich denke, die JS-Spezifikation definiert {} als "Codeblock", aber das ist selten im regulären JS-Code zu sehen - wie sieht ein "Codeblock" aus? Normalerweise ist ein Codeblock nur im Kontext einer Funktion. –

+1

@AlexanderMills Sie sehen Blöcke die ganze Zeit 'if (wahr) {...}' - hier ist ein Codeblock. Viele Dinge akzeptieren eine einzelne Anweisung als "Operand", wo ein Block als "Container" für mehrere Anweisungen fungiert. – zerkms

+0

@AlexanderMills: Es ist nicht Code-Blöcke, die selten sind, verwenden Sie Code-Blöcke in, wenn, für, während usw. Es ist Etiketten, die selten und fast nie verwendet werden – slebetman

Verwandte Themen