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.
*/
Friday, December 23, 2022
function expression
Thursday, December 22, 2022
TopLevelVarScopedDeclarations
Block
- Block : { }
Return a new empty List. - 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. - 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
Block
- Block : { }
Return a new empty List. - 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. - StatementListItem : Statement
Return a new empty List.//VariableStatement contribute to Var instead of Lex - 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
Block
- 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. - 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
Block
- Block : { }
Return a new empty List. - 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. - 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
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
return GetThisEnvironment().[[FunctionObject]].[[GetPrototypeOf]]()
example
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/super : super([arguments]) // calls the parent constructor.