Program (script) @1:1 ├─ FunctionDeclaration "level0" @1:1 │ ├─ parameters │ │ └─ Identifier "a" @1:17 │ └─ body │ └─ FunctionBody @2:5 │ ├─ VariableDeclaration (let) @2:5 │ │ └─ VariableDeclarator @2:5 │ │ ├─ Identifier "x" (let) @2:9 │ │ └─ NumericLiteral 1 @2:13 │ ├─ FunctionDeclaration "level1" @3:5 │ │ ├─ parameters │ │ │ └─ Identifier "b" @3:21 │ │ └─ body │ │ └─ FunctionBody @4:9 │ │ ├─ VariableDeclaration (let) @4:9 │ │ │ └─ VariableDeclarator @4:9 │ │ │ ├─ Identifier "y" (let) @4:13 │ │ │ └─ NumericLiteral 2 @4:17 │ │ ├─ FunctionDeclaration "level2" @5:9 │ │ │ ├─ parameters │ │ │ │ └─ Identifier "c" [argument:0] @5:25 │ │ │ └─ body │ │ │ └─ FunctionBody @6:13 │ │ │ └─ ReturnStatement @6:13 │ │ │ └─ BinaryExpression (+) @6:34 │ │ │ ├─ BinaryExpression (+) @6:30 │ │ │ │ ├─ BinaryExpression (+) @6:26 │ │ │ │ │ ├─ BinaryExpression (+) @6:22 │ │ │ │ │ │ ├─ Identifier "a" @6:20 │ │ │ │ │ │ └─ Identifier "x" (let) @6:24 │ │ │ │ │ └─ Identifier "b" @6:28 │ │ │ │ └─ Identifier "y" (let) @6:32 │ │ │ └─ Identifier "c" [argument:0] @6:36 │ │ └─ ReturnStatement @8:9 │ │ └─ CallExpression @8:22 │ │ ├─ Identifier "level2" [variable:0] @8:16 │ │ └─ NumericLiteral 3 @8:23 │ └─ ReturnStatement @10:5 │ └─ CallExpression @10:18 │ ├─ Identifier "level1" [variable:0] @10:12 │ └─ NumericLiteral 2 @10:19 └─ FunctionDeclaration "closure_over_var" @13:1 └─ body └─ FunctionBody @14:5 ├─ VariableDeclaration (var) @14:5 │ └─ VariableDeclarator @14:5 │ ├─ Identifier "counter" (var) @14:9 │ └─ NumericLiteral 0 @14:19 ├─ FunctionDeclaration "increment" @15:5 │ └─ body │ └─ FunctionBody @16:9 │ ├─ ExpressionStatement @16:9 │ │ └─ AssignmentExpression (=) @16:17 │ │ ├─ Identifier "counter" (var) @16:9 │ │ └─ BinaryExpression (+) @16:27 │ │ ├─ Identifier "counter" (var) @16:19 │ │ └─ NumericLiteral 1 @16:29 │ └─ ReturnStatement @17:9 │ └─ Identifier "counter" (var) @17:16 └─ ReturnStatement @19:5 └─ Identifier "increment" [variable:0] @19:12