/* * IsCallable() (E5 Section 9.11). * * IsCallable() cannot be directly tested, but Function.prototype.bind() * provides a very easy primitive for testing it. E5 Section 15.3.4.5, step * 2 will throw a TypeError if IsCallable(func) is false. */ function indirectIsCallable(x) { Function.prototype.bind.call(x); } /*=== TypeError TypeError TypeError TypeError TypeError TypeError TypeError TypeError no error no error no error ===*/ var values = [ undefined, null, true, false, 123.0, "foo", {}, [], function () {}, Object.prototype.toLocaleString, Object.prototype.toLocaleString.bind('foo') ]; var i; for (i = 0; i < values.length; i++) { try { indirectIsCallable(values[i]); print('no error'); } catch (e) { print(e.name); } }