Skip to content

Commit f743e61

Browse files
committed
[Robustness] remove runtime dependency on all builtins except .apply
1 parent d03555c commit f743e61

File tree

1 file changed

+40
-8
lines changed

1 file changed

+40
-8
lines changed

implementation.js

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,55 @@
33
/* eslint no-invalid-this: 1 */
44

55
var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
6-
var slice = Array.prototype.slice;
76
var toStr = Object.prototype.toString;
7+
var max = Math.max;
88
var funcType = '[object Function]';
99

10+
var concatty = function concatty(a, b) {
11+
var arr = [];
12+
13+
for (var i = 0; i < a.length; i += 1) {
14+
arr[i] = a[i];
15+
}
16+
for (var j = 0; j < b.length; j += 1) {
17+
arr[j + a.length] = b[j];
18+
}
19+
20+
return arr;
21+
};
22+
23+
var slicy = function slicy(arrLike, offset) {
24+
var arr = [];
25+
for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {
26+
arr[j] = arrLike[i];
27+
}
28+
return arr;
29+
};
30+
31+
var joiny = function (arr, joiner) {
32+
var str = '';
33+
for (var i = 0; i < arr.length; i += 1) {
34+
str += arr[i];
35+
if (i + 1 < arr.length) {
36+
str += joiner;
37+
}
38+
}
39+
return str;
40+
};
41+
1042
module.exports = function bind(that) {
1143
var target = this;
12-
if (typeof target !== 'function' || toStr.call(target) !== funcType) {
44+
if (typeof target !== 'function' || toStr.apply(target) !== funcType) {
1345
throw new TypeError(ERROR_MESSAGE + target);
1446
}
15-
var args = slice.call(arguments, 1);
47+
var args = slicy(arguments, 1);
1648

1749
var bound;
1850
var binder = function () {
1951
if (this instanceof bound) {
2052
var result = target.apply(
2153
this,
22-
args.concat(slice.call(arguments))
54+
concatty(args, arguments)
2355
);
2456
if (Object(result) === result) {
2557
return result;
@@ -28,18 +60,18 @@ module.exports = function bind(that) {
2860
}
2961
return target.apply(
3062
that,
31-
args.concat(slice.call(arguments))
63+
concatty(args, arguments)
3264
);
3365

3466
};
3567

36-
var boundLength = Math.max(0, target.length - args.length);
68+
var boundLength = max(0, target.length - args.length);
3769
var boundArgs = [];
3870
for (var i = 0; i < boundLength; i++) {
39-
boundArgs.push('$' + i);
71+
boundArgs[i] = '$' + i;
4072
}
4173

42-
bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
74+
bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder);
4375

4476
if (target.prototype) {
4577
var Empty = function Empty() {};

0 commit comments

Comments
 (0)