Function.prototype.callX = Function.prototype.call; var x; function f() { x = f.caller; return x; } function g() { return f.callX(null); } function h1() { // native return ([0].map(f))[0]; } function h2() { // self-hosted x = null; [0].forEach(f); return x; } function k() { x = null; [0, 1].sort(f); return x; } function l() { return f(); } assertEq(g(), g); assertEq(h1(), h1); assertEq(h2(), h2); assertEq(k(), k); assertEq(l(), l); var baz; var foo = {callX: function() { return "m"; }}; function bar() { return baz.caller; } function m() { return baz.callX(null); } baz = foo; assertEq(m(), "m"); baz = bar; assertEq(m(), m); assertEq(m(), m);