function a() { return "a"; } function b() { return "b"; } function c() { return "c"; } var names = ["a","b","c"]; function foo(name) { return eval(name + "()"); } for (var i = 0; i < names.length; i++) assertEq(foo(names[i]), names[i]); // Test bailout due to bad name passed to eval. try { foo("missing"); } catch (e) { assertEq(/missing/.test(e), true); } function bar(name) { return eval(name + "()"); } for (var i = 0; i < names.length; i++) assertEq(bar(names[i]), names[i]); function recursion() { return bar({ valueOf: function() { return "gotcha"; }}); } function gotcha() { return "gotcha"; } // Test invalidation within call made after name lookup. assertEq(bar("recursion"), "gotcha");