Otras declaraciones que devuelven un finalización normal, son, por ejemplo, un vacío Block
statement, la Empty Statement, la ExpressionStatement, la debugger
statement (cuando ningún depurador adjunta), etc ...
Un FunctionDeclaration
(que no es una declaración, sino una SourceElement
) también devuelve una finalización (normal, empty, empty)
, es por eso que, por ejemplo, :
eval("function f(){}"); // returns undefined
el eval
function después de ejecutar el código, examina el resultado la terminación, y si el tipo es normal
y el valor es empty
, produce explícitamente undefined
(ver paso 7 de eval
), mientras que:
eval("(function f(){})"); // returns a function object
Allí los paréntesis construir un PrimaryExpression
, que es parte de un ExpressionStatement
, y esta instrucción devuelve la finalización (normal, GetValue(exprRef), empty)
, donde expRef
será el valor de la FunctionExpression
.
Si la finalización type
si no es normal
se conoce también como "terminación abrupta".
Por ejemplo:
function foo() {
return 5;
}
foo();
La declaración return
dentro foo
producirá una terminación que se parece a (return, 4, empty)
.
El valor target
en el triplete es utilizado solamente por break
y continue
, para hacer referencia a un identificador de un LabelledStatement
, por ejemplo:
foo: while(true) {
while(true) {
break foo;
}
}
El resultado la finalización de la break
declaración anterior habría (break, empty, foo)
, ya que el flujo de control se transfiere desde el interior del segundo while
al exterior, al nivel de la etiqueta foo
.
se puede ver más detalles acerca de cómo se utiliza este tipo interno, en todas las demás instrucciones que realizan no locales de las transferencias de control como break
, continue
, return
y throw
.
Gracias por su ayuda – okjungsoo