| function f1(a, aIs, // without default parameter |
| b=()=>62, bIs, // with default parameter |
| // before function body |
| c=(assertEq(a(), aIs), assertEq(b(), bIs), |
| ()=>63), |
| cIs) { |
| // before function declarations |
| assertEq(a(), 52); |
| assertEq(b(), 53); |
| assertEq(c(), 55); |
| |
| function a() { |
| return 52; |
| } |
| function c() { |
| return 54; |
| } |
| function g() { |
| // close here |
| assertEq(a(), 52); // after function declaration |
| assertEq(b(), 53); // before function declaration |
| assertEq(c(), 55); // before last function declaration |
| } |
| // function declaration after closed |
| function b() { |
| return 53; |
| } |
| |
| assertEq(a(), 52); // after function declaration |
| assertEq(b(), 53); // after function declaration |
| assertEq(c(), 55); // before last function declaration |
| |
| g(); |
| c = ()=>72; |
| assertEq(c(), 72); // after assignment in body |
| h(); |
| assertEq(c(), 82); // after assignment in closed function |
| |
| function h() { |
| assertEq(c(), 72); // after assignment in body |
| c = ()=>82; |
| assertEq(c(), 82); // after assignment in closed function |
| } |
| // function re-declaration after closed and assignment |
| function c() { |
| return 55; |
| } |
| } |
| f1(()=>42, 42, undefined, 62, undefined, 63); |
| f1(()=>42, 42, undefined, 62, ()=>44, 44); |
| f1(()=>42, 42, ()=>43, 43, undefined, 63); |
| f1(()=>42, 42, ()=>43, 43, ()=>44, 44); |
| |
| function f2(a, aIs, |
| // call before body |
| b=(function() { assertEq(a(), aIs); })(), |
| // call inside body |
| c=function() { assertEq(a(), 52); }) { |
| function a() { |
| return 52; |
| } |
| function g() { |
| // close here |
| assertEq(a(), 52); |
| } |
| |
| assertEq(a(), 52); |
| g(); |
| c(); |
| } |
| f2(()=>42, 42); |
| |
| function f3(a, aIs, |
| // call before body |
| // close here |
| b=(function() { assertEq(a(), aIs); })(), |
| // call inside body |
| c=function() { assertEq(a(), 52); }) { |
| function a() { |
| return 52; |
| } |
| |
| assertEq(a(), 52); |
| c(); |
| } |
| f3(()=>42, 42); |
| |
| function f4(a, |
| // assignment before body |
| b=a=()=>62, |
| c=(assertEq(a(), 62)), |
| // function declaration before body |
| d=eval("function a() { return 72; }"), |
| e=(assertEq(a(), 72))) { |
| function a() { |
| return 52; |
| } |
| function g() { |
| // close here |
| assertEq(a(), 52); |
| } |
| |
| assertEq(a(), 52); |
| g(); |
| } |
| f4(()=>42); |
| |
| function f5(a, b, c, d) { |
| // before var/function declarations |
| assertEq(a(), 52); |
| assertEq(b(), 53); |
| assertEq(c(), 54); |
| assertEq(d(), 55); |
| |
| function g() { |
| // before var/function declarations, called after var declarations |
| // close here |
| assertEq(a(), 52); |
| assertEq(b(), 63); |
| assertEq(c(), 54); |
| assertEq(d(), 65); |
| } |
| |
| var a, b = ()=>63; |
| var c, d = ()=>65; |
| |
| // after var declarations, before function declarations |
| assertEq(a(), 52); |
| assertEq(b(), 63); |
| assertEq(c(), 54); |
| assertEq(d(), 65); |
| |
| function h() { |
| // after var declarations, before function declarations |
| assertEq(a(), 52); |
| assertEq(b(), 63); |
| assertEq(c(), 54); |
| assertEq(d(), 65); |
| } |
| function a() { |
| return 52; |
| } |
| function b() { |
| return 53; |
| } |
| function c() { |
| return 54; |
| } |
| function d() { |
| return 55; |
| } |
| function i() { |
| // after var/function declarations |
| assertEq(a(), 52); |
| assertEq(b(), 63); |
| assertEq(c(), 54); |
| assertEq(d(), 65); |
| } |
| |
| // after var/function declarations |
| assertEq(a(), 52); |
| assertEq(b(), 63); |
| assertEq(c(), 54); |
| assertEq(d(), 65); |
| g(); |
| h(); |
| i(); |
| } |
| f5(()=>42, ()=>43, ()=>44, ()=>45); |