2014-12-09 7 views
22

Warum wird bei der Destrukturierung von Objekten ein Fehler ausgegeben, wenn kein var Schlüsselwort davor steht?Objekt Destrukturierung ohne var

{a, b} = {a: 1, b: 2}; 

wirft SyntaxError: expected expression, got '='

Die folgenden drei Beispiele arbeiten ohne Probleme

var {a, b} = {a: 1, b: 2}; 
var [c, d] = [1, 2]; 
    [e, f] = [1, 2]; 

Bonus Frage: Warum wir keine var für Array Destrukturierung benötigen?

lief ich in das Problem, etwas zu tun

function() { 
    var {a, b} = objectReturningFunction(); 

    // Now a and b are local variables in the function, right? 
    // So why can't I assign values to them? 

    {a, b} = objectReturningFunction(); 
} 

Antwort

31

Die Frage der Mehrdeutigkeit in JavaScript mit {...} Betreiber stammt.

Wenn { zu Beginn eines Statement erscheint, wird es immer, für ein block, die nicht zugeordnet werden kann. Wenn es später in der Anweisung als Ausdruck erscheint, dann wird es ein Objekt darstellen.

Die var hilft, diese Unterscheidung zu treffen, da sie nicht von einem Statement, ebenso wie grouping parenthesis verfolgt werden kann:

({a, b} = objectReturningFunction()); 
-2

Referenz von MDN:

die gleiche Variable innerhalb derselben erneut deklariert werden Funktions- oder Blockbereich löst einen SyntaxError aus.

if (x) { 
    let foo; 
    let foo; // SyntaxError thrown. 
} 

Temporal dead zone and errors with let

+0

Sie sollte zumindest eine Notiz hinzufügen, sagen, dass die Frage falsch ist. – Taurus