2010-10-18 18 views
5

La produzione VariableStatement:semantica VariableStatement in ECMAScript

var VariableDeclarationList ; 

è valutata come segue:

  1. Valutare VariableDeclarationList.
  2. Ritorno (normal, empty, empty).

Voglio conoscere il significato di normale e vuoto.

risposta

7

ECMAScript descrive un tipo interno per spiegare il comportamento delle istruzioni, si chiama The Completion Specification Type.

Valori del tipo di completamento sono triple della forma di (type, value, target), dove:

  • type può essere normal, break, continue, return o throw.
  • value può essere qualsiasi valore di lingua o empty.
  • target può essere qualsiasi Identifier o empty.

Nel caso del VariableStatement, il completamento restituito ha alcun effetto osservabile, è una normale completamento, poiché il flusso di controllo non viene modificata.

Altro dichiarazioni che restituiscono un completamento normale , ad es. un vuoto Block statement, il Empty Statement, il ExpressionStatement, il debugger statement (quando non debugger), ecc ...

A FunctionDeclaration (che non è una dichiarazione, ma un SourceElement) restituisce anche un completamento (normal, empty, empty), ecco perché per esempio :

eval("function f(){}"); // returns undefined 

il eval function dopo l'esecuzione del codice, esamina il risultato completamento, e se il tipo è normal e il valore è empty, produce esplicitamente undefined (vedi punto 7 di eval), mentre:

eval("(function f(){})"); // returns a function object 

Ci le parentesi costruire un PrimaryExpression, che fa parte di un ExpressionStatement, e questa dichiarazione restituisce il completamento (normal, GetValue(exprRef), empty), dove expRef sarà il valore del FunctionExpression.

Se il completamento type se diversa normal è noto anche come "completamento brusca".

Ad esempio:

function foo() { 
    return 5; 
} 
foo(); 

Il return istruzione all'interno foo produrrà un completamento che assomiglia (return, 4, empty).

Il valore target nella tripletta viene utilizzato solo per break e continue, fare riferimento a un identificatore di un LabelledStatement, ad esempio:

foo: while(true) { 
    while(true) { 
    break foo; 
    } 
} 

Il risultato completamento di quanto sopra break dichiarazione sarebbe (break, empty, foo), poiché il flusso di controllo viene trasferito dall'interno del secondo while all'esterno, a livello dell'etichetta foo.

si possono vedere più dettagli su come viene utilizzato questo tipo interno, su tutte le altre dichiarazioni che eseguono non locali trasferimenti di controllo come break, continue, return e throw.

+0

Grazie per il vostro aiuto – okjungsoo