ECMAScript décrit un type interne pour expliquer le comportement des instructions, il s'appelle The Completion Specification Type.
valeurs du type de réalisation sont triplets de la forme de (type, value, target)
, où:
type
peut être normal
, break
, continue
, return
ou throw
.
value
peut être n'importe quelle valeur de langue ou empty
.
target
peut être n'importe quel Identifier
ou empty
.
Dans le cas du VariableStatement
, l'achèvement de retour n'a pas d'effet observable, il est une fin normale , puisque le flux de contrôle n'est pas modifiée.
Autres instructions qui retournent un achèvement normal, sont par exemple. un vide Block
statement, le Empty Statement, le ExpressionStatement, le debugger
statement (lorsqu'aucun débogueur ci-joint), etc ...
A FunctionDeclaration
(ce qui est une déclaration, mais un SourceElement
) retourne aussi une fin (normal, empty, empty)
, c'est pourquoi, par exemple :
eval("function f(){}"); // returns undefined
le eval
function après l'exécution du code, on examine le résultat d'achèvement, et si le type est normal
et la valeur est empty
, il produit explicitement undefined
(voir étape 7 de eval
), tandis que:
eval("(function f(){})"); // returns a function object
Là, les parenthèses construire une PrimaryExpression
, qui fait partie d'un ExpressionStatement
, et cette déclaration renvoie l'achèvement (normal, GetValue(exprRef), empty)
, où expRef
sera la valeur de la FunctionExpression
.
Si l'achèvement type
si autre que normal
est également connu comme un « fin abrupte ».
Par exemple:
function foo() {
return 5;
}
foo();
La déclaration return
à l'intérieur foo
produira une fin qui ressemble à (return, 4, empty)
.
La valeur target
dans le triplet est uniquement utilisée par break
et continue
, pour faire référence à un identifiant d'un LabelledStatement
, par exemple:
foo: while(true) {
while(true) {
break foo;
}
}
Le résultat de l'achèvement de l'instruction break
ci-dessus serait (break, empty, foo)
, étant donné que l'écoulement de contrôle est transféré de l'intérieur while
à l'extérieur, au niveau de l'étiquette foo
.
Vous pouvez voir plus de détails sur la façon dont ce type interne est utilisé, sur toutes les autres déclarations qui effectuent nonlocal transferts de contrôle comme break
, continue
, return
et throw
.
Nous vous remercions de votre aide – okjungsoo