2010-10-18 5 views

Répondre

7

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.

+0

Nous vous remercions de votre aide – okjungsoo

Questions connexes