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
.
Grazie per il vostro aiuto – okjungsoo