(function() { function foo(x) { return 1 + this.f; } function bar(x) { return x + this.f; } function baz(x) { return x + 1 + this.f; } var n = 1000000; var result = (function(o) { var f = {fun:foo, f:1}; var g = {fun:bar, f:2}; var h = {fun:baz, f:3}; var result = 0; for (var i = 0; i < n; ++i) { if (i == n - 1) f = h; result += f.fun(o.f); var tmp = f; f = g; g = tmp; } return result; })({f:42}); if (result != ((n / 2 - 1) * (42 + 2)) + (n / 2 * (1 + 1) + (42 + 1 + 3))) throw "Error: bad result: " + result; })();