2010-10-18 16 views

Respuesta

7

ECMAScript describe un tipo interno para explicar el comportamiento de las declaraciones, se llama The Completion Specification Type.

valores del tipo de finalización son triples de la forma de (type, value, target), donde:

  • type puede ser normal, break, continue, return, o throw.
  • value puede tener cualquier valor de idioma o empty.
  • target puede ser cualquier Identifier o empty.

En el caso de la VariableStatement, la finalización devuelto no tiene ningún efecto observable, es una finalización normal, ya que el flujo de controlno se modifica.

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.

+0

Gracias por su ayuda – okjungsoo