michael@0: var x = 'global'; michael@0: function f(a=x) { // local variable x michael@0: var x = 'local'; michael@0: return a; michael@0: } michael@0: assertEq(f(), undefined); michael@0: michael@0: function g(f=function () { return ++x; }) { // closes on local variable x michael@0: var x = 0; michael@0: return f; michael@0: } michael@0: var gf = g(); michael@0: assertEq(gf(), 1); michael@0: assertEq(gf(), 2); michael@0: gf = g(); michael@0: assertEq(gf(), 1); michael@0: michael@0: function h(f=function (s) { return eval(s); }) { // closes on local scope michael@0: var x = 'hlocal'; michael@0: return f; michael@0: } michael@0: var hf = h(); michael@0: assertEq(hf('x'), 'hlocal'); michael@0: assertEq(hf('f'), hf); michael@0: assertEq(hf('var x = 3; x'), 3); michael@0: michael@0: function j(expr, v=eval(expr)) { michael@0: return v; michael@0: } michael@0: assertEq(j("expr"), "expr"); michael@0: assertEq(j("v"), undefined); michael@0: assertEq(j("Array"), Array); michael@0: assertEq(j("arguments").length, 1);