function assert(b) { if (!b) throw new Error("bad"); } function test(f) { for (let i = 0; i < 1000; i++) f(); } test(function() { function foo(a, b) { assert(arguments[0] === a); assert(arguments[1] === b); assert(arguments.length === 2); arguments[0] = "hello"; arguments[1] = "world"; assert(a === "hello"); assert(b === "world"); } foo(null, null); }); test(function() { function foo(a, b) { assert(arguments[0] === a); assert(arguments[1] === b); assert(arguments.length === 2); a = "hello"; b = "world"; assert(arguments[0] === "hello"); assert(arguments[1] === "world"); } foo(null, null); }); test(function() { function foo(a, b, ...rest) { assert(arguments[0] === a); assert(arguments[1] === b); assert(arguments.length === 2); arguments[0] = "hello"; arguments[1] = "world"; assert(a === null); assert(b === null); } foo(null, null); }); test(function() { function foo(a, b, ...rest) { assert(arguments[0] === a); assert(arguments[1] === b); assert(arguments.length === 2); a = "hello"; b = "world"; assert(arguments[0] === null); assert(arguments[1] === null); } foo(null, null); }); test(function() { function foo(a, b, {destructure}) { assert(arguments[0] === a); assert(arguments[1] === b); assert(arguments.length === 3); arguments[0] = "hello"; arguments[1] = "world"; assert(a === null); assert(b === null); } foo(null, null, {}); }); test(function() { function foo(a, b, {destructure}) { assert(arguments[0] === a); assert(arguments[1] === b); assert(arguments.length === 3); a = "hello"; b = "world"; assert(arguments[0] === null); assert(arguments[1] === null); } foo(null, null, {}); }); test(function() { function foo(a, b, defaultParam = 20) { assert(arguments[0] === a); assert(arguments[1] === b); assert(arguments.length === 3); arguments[0] = "hello"; arguments[1] = "world"; assert(a === null); assert(b === null); } foo(null, null, {}); }); test(function() { function foo(a, b, defaultParam = 20) { assert(arguments[0] === a); assert(arguments[1] === b); assert(arguments.length === 3); a = "hello"; b = "world"; assert(arguments[0] === null); assert(arguments[1] === null); } foo(null, null, {}); }); test(function() { let obj = {} function foo(a, b, {foo = b}) { assert(foo === b); assert(foo === obj); } foo(null, obj, {}); }); test(function() { let obj = {} function foo(a, b, {foo = b}) { assert(foo === b); assert(foo === obj); function capB() { return b; } } foo(null, obj, {}); }); test(function() { let obj = {} function foo(a, b, {foo = b}) { assert(foo === 25); } foo(null, obj, {foo: 25}); }); test(function() { let obj = {} function foo(a, b, {foo = function() { return b; }}) { assert(foo() === b); assert(foo() === obj); return foo; } let result = foo(null, obj, {}); assert(result() === obj); }); test(function() { let obj = {} function foo(a, b, [foo = function() { return b; }]) { assert(foo() === b); assert(foo() === obj); return foo; } let result = foo(null, obj, [undefined]); assert(result() === obj); }); test(function() { let obj = {} function foo(a, b, [foo = function() { return e; }], {d = foo()}, e) { } foo(null, obj, [], {d:null}, 20); }); test(function() { let obj = {} function foo(a, b, [foo = function() { return e; }], {d = foo()}, e) { } try { foo(null, obj, [], {}, 20); } catch(e) { assert(e.toString() === "ReferenceError: Cannot access uninitialized variable."); } }); test(function() { let obj = {} function foo(a, b, [foo = function() { return e; }], e, {d = foo()}) { return d; } assert(foo(null, obj, [], 20, {}) === 20); }); test(function() { let obj = {} function foo(a, b, [foo = function() { return e; }], e, {d = foo()}) { var d; assert(d === 20); return d; } assert(foo(null, obj, [], 20, {}) === 20); }); test(function() { function foo(b, {a = function() { return b; }}) { var b = 25; assert(b === 25); assert(a() === 20); } foo(20, {}); }); test(function() { function foo(b, {a = function() { return typeof inner; }}) { let inner = 25; assert(inner === 25); assert(a() === "undefined"); } foo(20, {}); }); test(function() { let obj = {}; let inner = obj; function foo(b, {a = function() { return inner; }}) { let inner = 25; assert(inner === 25); assert(a() === obj); } foo(20, {}); }); test(function() { let obj = {}; let inner = obj; let foo = (b, {a = function() { return inner; }}) => { let inner = 25; assert(inner === 25); assert(a() === obj); } foo(20, {}); });