Friday, December 23, 2022

function expression

function expression
factit = function factorial(n) {
    console.log(n)
    if (n < 2) {
      return 1;
    }
    return n * factorial(n - 1);
}

non_recursive = function(){}

/*
can't visit factorial here:
as is indicated in `Runtime Semantics: Evaluation` of NAMED function expression,
we will NewDeclarativeEnvironment(scope) as a middle env to recv factorial

from ecma:
The BindingIdentifier in a FunctionExpression can be referenced
 from inside the FunctionExpression's
FunctionBody to allow the function to call itself recursively.

However, unlike in a FunctionDeclaration, the BindingIdentifier in
a FunctionExpression cannot be referenced from and does
not affect the scope enclosing the FunctionExpression.
*/

Thursday, December 22, 2022

TopLevelVarScopedDeclarations

TopLevelVarScopedDeclarations

Block

  1. Block : { }
        Return a new empty List.
    
  2. StatementList : StatementList StatementListItem //StatementListItem can be Statement or Declaration
        Let declarations be TopLevelVarScopedDeclarations of StatementList.
        Append to declarations the elements of the TopLevelVarScopedDeclarations of StatementListItem.
        Return declarations.
    
  3. StatementListItem : Declaration
        if is function Declaration, return a list contains the Declaration// function is not taken as Lex but top level Var!
    

Label Statement

LabelledStatement : LabelIdentifier : LabelledItem

    Return the TopLevelVarScopedDeclarations of LabelledItem.

LabelledItem : Statement

    // recursive to the last non-labelled Statement
    If Statement is Statement : LabelledStatement , return TopLevelVarScopedDeclarations of Statement
    Return VarScopedDeclarations of Statement.

Others

not documented in ecma documents

TopLevelLexicallyScopedDeclarations

TopLevelLexicallyScopedDeclarations

Block

  1. Block : { }
        Return a new empty List.
    
  2. StatementList : StatementList StatementListItem //StatementListItem can be Statement or Declaration
        Let declarations be TopLevelLexicallyScopedDeclarations of StatementList.
        Append to declarations the elements of the TopLevelLexicallyScopedDeclarations of StatementListItem.
        Return declarations.
    
  3. StatementListItem : Statement
        Return a new empty List.//VariableStatement contribute to Var instead of Lex
    
  4. StatementListItem : Declaration
        if Declaration is `let ` or `const `, return a new List containing Declaration;
        else Return a new empty List// TopLevel functions are taken as Var instead
    

Labelled Statements

Return a new empty List

Others

not documented in ecma documents

LexicallyScopedDeclarations

LexicallyScopedDeclarations

Block

  1. StatementList : StatementList StatementListItem //StatementListItem can be Statement or Declaration
        Let declarations be LexicallyScopedDeclarations of StatementList.
        Append to declarations the elements of the LexicallyScopedDeclarations of StatementListItem.
        Return declarations.
    
  2. StatementListItem : Declaration
        Return a new List containing the Declaration
    

FunctionStatementList : StatementList or Script

    Return the TopLevelLexicallyScopedDeclarations of StatementList.

LabelledItem : FunctionDeclaration

Return a new List containing FunctionDeclaration.

Others

not documented in ecma documents

`catch ( CatchParameter ) Block` is not mentioned, but according to "Runtime Semantics: CatchClauseEvaluation", CatchParameter should be Lexically Declared

VarScopedDeclarations

VarScopedDeclarations

Block

  1. Block : { }
        Return a new empty List.
    
  2. StatementList : StatementList StatementListItem //StatementListItem can be Statement or Declaration
        Let declarations be VarScopedDeclarations of StatementList.
        Append to declarations the elements of the VarScopedDeclarations of StatementListItem.
        Return declarations.
    
  3. StatementListItem : Declaration
        Return a new empty List// `let ` or `const ` Declaration is Lex, funct decl is top Var
    

Variable Statement

Return a new List contains all VariableDeclaration

FunctionStatementList : StatementList or Script

    Return the TopLevelVarScopedDeclarations of StatementList.

Statements contains subs

if/while/for/with/switch/label/try Statement, return a new List contains all VariableDeclaration of the sub(s)

for the case of `for(var `, the new List is pre-feed.

note in `catch ( CatchParameter ) Block`, CatchParameter is not included.

note in label Statement, `LabelledItem : FunctionDeclaration` Return a new empty List.

Others

not documented in ecma documents

Wednesday, December 21, 2022

let, var and const

let, var and const
function outer_func()
{
    {{
        var var01 = "var01";
        let innerLet = "innerLet";//        const innerCst = "innerCst";

        function inner_func()
        {
            alert("inner_func");
        }
    }}
    // var01 is accessible here
    // it's an early error to access innerLet here

    inner_func();
}

outer_func();

Monday, December 19, 2022

GetSuperConstructor

12.3.7.2 Runtime Semantics: GetSuperConstructor ( )

return GetThisEnvironment().[[FunctionObject]].[[GetPrototypeOf]]()

example

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super : super([arguments]) // calls the parent constructor.