supongamos que tenemos una función y dentro de esa función, tenemos una declaración let en el nivel más alto de la función.
ahora ejecutamos FunctionDeclarationInstantiation , pero aquí viene la parte extraña, observe el paso 33 .
Deje que lexDeclarations sea LexicallyScopedDeclarations del código.
así que invocamos la operación LexicallyScopedDeclarations con el nodo de análisis FunctionBody .
por lo tanto, ejecutamos la definición del algoritmo implícito (porque no hay un algoritmo para la producción de FunctionBody )
FunctionBody:FunctionStatementList Return LexicallyScopedDeclarations of FunctionStatementListentonces llegamos a este algoritmo
FunctionStatementList:StatementList Return the TopLevelLexicallyScopedDeclarations of StatementList.y ahí es donde comienza mi confusión , porque ahora cuando invocamos TopLevelLexicallyScopedDeclarations con StatementList
y llegaremos aquí
StatementList : StatementList StatementListItem 1. Let declarations1 be TopLevelLexicallyScopedDeclarations of StatementList. 2. Let declarations2 be TopLevelLexicallyScopedDeclarations of StatementListItem. 3. Return the list-concatenation of declarations1 and declarations2.finalmente, eso nos llevará a este algoritmo
StatementListItem : Declaration 1. If Declaration is Declaration : HoistableDeclaration , then a. Return a new empty List. 2. Return « Declaration ».ahora, ¿cómo se supone que obtendremos la variable let que mencioné anteriormente, si el paso 1 dice que si esa Declaración es una Declaración: HoistableDeclaration, entonces devolvemos una lista vacía?
no tiene ningún sentido para mí.