| 'use strict'; | 
| var uncurryThis = require('../internals/function-uncurry-this'); | 
| var aCallable = require('../internals/a-callable'); | 
| var isObject = require('../internals/is-object'); | 
| var hasOwn = require('../internals/has-own-property'); | 
| var arraySlice = require('../internals/array-slice'); | 
| var NATIVE_BIND = require('../internals/function-bind-native'); | 
|   | 
| var $Function = Function; | 
| var concat = uncurryThis([].concat); | 
| var join = uncurryThis([].join); | 
| var factories = {}; | 
|   | 
| var construct = function (C, argsLength, args) { | 
|   if (!hasOwn(factories, argsLength)) { | 
|     var list = []; | 
|     var i = 0; | 
|     for (; i < argsLength; i++) list[i] = 'a[' + i + ']'; | 
|     factories[argsLength] = $Function('C,a', 'return new C(' + join(list, ',') + ')'); | 
|   } return factories[argsLength](C, args); | 
| }; | 
|   | 
| // `Function.prototype.bind` method implementation | 
| // https://tc39.es/ecma262/#sec-function.prototype.bind | 
| // eslint-disable-next-line es/no-function-prototype-bind -- detection | 
| module.exports = NATIVE_BIND ? $Function.bind : function bind(that /* , ...args */) { | 
|   var F = aCallable(this); | 
|   var Prototype = F.prototype; | 
|   var partArgs = arraySlice(arguments, 1); | 
|   var boundFunction = function bound(/* args... */) { | 
|     var args = concat(partArgs, arraySlice(arguments)); | 
|     return this instanceof boundFunction ? construct(F, args.length, args) : F.apply(that, args); | 
|   }; | 
|   if (isObject(Prototype)) boundFunction.prototype = Prototype; | 
|   return boundFunction; | 
| }; |