简单实现bind、apply和call
# bind
Function.prototype.bind2 = function(context) {
var _this = this;
var argsParent = Array.prototype.slice.call(arguments, 1);
return function() {
var args = argsParent.concat(Array.prototype.slice.call(arguments));
_this.apply(context,args);
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# apply
Function.prototype.apply2 = function(context, arr) {
var context = context || window;//因为传进来的context有可能是null
context.fn = this;
var args = [];
var params = arr || [];
for(var i = 0;i<params.length;i++) {
args.push("params[" + i + "]"); //不这么做的话 字符串的引号会被自动去掉 变成了变量 导致报错
}
args = args.join(",");
var result = eval("context.fn(" + args + ")"); //相当于执行了context.fn(arguments[1], arguments[2]);
delete context.fn;
return result; //因为有可能this函数会有返回值return
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# call
Function.prototype.call2 = function(context) {
var context = context || window; // 传进来的context有可能是空
context.fn = this;
var args = [];
for (var i = 1; i < arguments.length; i++) {
args.push("arguments[" + i + "]"); //不这么做的话 字符串的引号会被自动去掉 变成了变量 导致报错
}
args = args.join(",");
var result = eval("context.fn(" + args + ")"); //相当于执行了context.fn(arguments[1], arguments[2]);
delete context.fn;
return result; //因为有可能this函数会有返回值return
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
在Github上编辑此页 (opens new window)
上次更新: 3/22/2021, 3:47:15 AM