diff --git a/lodash.js b/lodash.js index 8344b2db6..ffa4646e4 100644 --- a/lodash.js +++ b/lodash.js @@ -1355,8 +1355,7 @@ if (typeof func != 'function') { return identity; } - // exit early for no `thisArg` or already bound by `Function#bind` - if (typeof thisArg == 'undefined' || !('prototype' in func)) { + if (typeof thisArg == 'undefined') { return func; } var data = func[expando]; @@ -1372,7 +1371,7 @@ } if (!data) { // checks if `func` references the `this` keyword and stores the result - data = reThis.test(source); + data = reThis.test(source) || isNative(func); setData(func, data); } } @@ -8117,7 +8116,7 @@ var type = typeof func, isFunc = type == 'function'; - if (isFunc && (typeof thisArg == 'undefined' || !('prototype' in func))) { + if (isFunc && typeof thisArg == 'undefined') { return func; } if (isFunc || func == null) { diff --git a/test/test.js b/test/test.js index 3a82b949f..0090abf58 100644 --- a/test/test.js +++ b/test/test.js @@ -1741,16 +1741,16 @@ (function() { test('should create a callback with a falsey `thisArg`', 1, function() { - var values = _.map(falsey, function(value) { + var expected = _.map(falsey, function(value) { return Object(value == null ? root : value); }); - var actual = _.map(values, function(value) { + var actual = _.map(falsey, function(value) { var callback = _.callback(function() { return this; }, value); return callback(); }); - deepEqual(actual, values); + ok(_.isEqual(actual, expected)); }); test('should return `_.identity` when `func` is nullish', 2, function() { @@ -1818,15 +1818,18 @@ deepEqual(callback(2), expected); }); - test('should return the function provided if already bound with `Function#bind`', 1, function() { - function a() {} + test('should support binding built-in methods', 2, function() { + var object = { 'a': 1 }, + callback = _.callback(Object.prototype.hasOwnProperty, object); - var object = {}, - bound = a.bind && a.bind(object); + strictEqual(callback('a'), true); - if (bound && !('prototype' in bound)) { - var bound = a.bind(object); - strictEqual(_.callback(bound, object), bound); + var fn = function () {}, + bound = fn.bind && fn.bind(object); + + if (bound) { + callback = _.callback(bound, object); + notStrictEqual(callback, bound); } else { skipTest();