| /** |
| * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/> |
| * Build: `lodash modularize modern exports="node" -o ./modern/` |
| * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/> |
| * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE> |
| * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors |
| * Available under MIT license <http://lodash.com/license> |
| */ |
| var bind = require('../functions/bind'), |
| identity = require('../utilities/identity'), |
| setBindData = require('./setBindData'), |
| support = require('../support'); |
| |
| /** Used to detected named functions */ |
| var reFuncName = /^\s*function[ \n\r\t]+\w/; |
| |
| /** Used to detect functions containing a `this` reference */ |
| var reThis = /\bthis\b/; |
| |
| /** Native method shortcuts */ |
| var fnToString = Function.prototype.toString; |
| |
| /** |
| * The base implementation of `_.createCallback` without support for creating |
| * "_.pluck" or "_.where" style callbacks. |
| * |
| * @private |
| * @param {*} [func=identity] The value to convert to a callback. |
| * @param {*} [thisArg] The `this` binding of the created callback. |
| * @param {number} [argCount] The number of arguments the callback accepts. |
| * @returns {Function} Returns a callback function. |
| */ |
| function baseCreateCallback(func, thisArg, argCount) { |
| if (typeof func != 'function') { |
| return identity; |
| } |
| // exit early for no `thisArg` or already bound by `Function#bind` |
| if (typeof thisArg == 'undefined' || !('prototype' in func)) { |
| return func; |
| } |
| var bindData = func.__bindData__; |
| if (typeof bindData == 'undefined') { |
| if (support.funcNames) { |
| bindData = !func.name; |
| } |
| bindData = bindData || !support.funcDecomp; |
| if (!bindData) { |
| var source = fnToString.call(func); |
| if (!support.funcNames) { |
| bindData = !reFuncName.test(source); |
| } |
| if (!bindData) { |
| // checks if `func` references the `this` keyword and stores the result |
| bindData = reThis.test(source); |
| setBindData(func, bindData); |
| } |
| } |
| } |
| // exit early if there are no `this` references or `func` is bound |
| if (bindData === false || (bindData !== true && bindData[1] & 1)) { |
| return func; |
| } |
| switch (argCount) { |
| case 1: return function(value) { |
| return func.call(thisArg, value); |
| }; |
| case 2: return function(a, b) { |
| return func.call(thisArg, a, b); |
| }; |
| case 3: return function(value, index, collection) { |
| return func.call(thisArg, value, index, collection); |
| }; |
| case 4: return function(accumulator, value, index, collection) { |
| return func.call(thisArg, accumulator, value, index, collection); |
| }; |
| } |
| return bind(func, thisArg); |
| } |
| |
| module.exports = baseCreateCallback; |