|
'use strict'; |
|
|
|
var bind = require('function-bind'); |
|
var GetIntrinsic = require('get-intrinsic'); |
|
|
|
var $apply = GetIntrinsic('%Function.prototype.apply%'); |
|
var $call = GetIntrinsic('%Function.prototype.call%'); |
|
var $reflectApply = GetIntrinsic('%Reflect.apply%', true) || bind.call($call, $apply); |
|
|
|
var $gOPD = GetIntrinsic('%Object.getOwnPropertyDescriptor%', true); |
|
var $defineProperty = GetIntrinsic('%Object.defineProperty%', true); |
|
var $max = GetIntrinsic('%Math.max%'); |
|
|
|
if ($defineProperty) { |
|
try { |
|
$defineProperty({}, 'a', { value: 1 }); |
|
} catch (e) { |
|
|
|
$defineProperty = null; |
|
} |
|
} |
|
|
|
module.exports = function callBind(originalFunction) { |
|
var func = $reflectApply(bind, $call, arguments); |
|
if ($gOPD && $defineProperty) { |
|
var desc = $gOPD(func, 'length'); |
|
if (desc.configurable) { |
|
|
|
$defineProperty( |
|
func, |
|
'length', |
|
{ value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) } |
|
); |
|
} |
|
} |
|
return func; |
|
}; |
|
|
|
var applyBind = function applyBind() { |
|
return $reflectApply(bind, $apply, arguments); |
|
}; |
|
|
|
if ($defineProperty) { |
|
$defineProperty(module.exports, 'apply', { value: applyBind }); |
|
} else { |
|
module.exports.apply = applyBind; |
|
} |
|
|