bind/apply/call
bind
Function.prototype.bind2 = function(context) {
let _this = this;
let argsParent = Array.prototype.slice.call(arguments, 1);
return function() {
var args = argsParent.concat(Array.prototype.slice.call(arguments)); // 转化成数组
_this.apply(context, args);
};
}
apply
Function.prototype.apply2 = function(context, arr) {
let context = context || window; // 因为传进来的context有可能是null
context.fn = this;
let args = [];
let params = arr || [];
for (var i = 0; i < params.length; i++) {
args.push("params[" + i + "]"); // 不这么做的话 字符串的引号会被自动去掉 变成了变量 导致报错
}
args = args.join(",");
let result = eval("context.fn(" + args + ")"); // 相当于执行了context.fn(arguments[1], arguments[2]);
delete context.fn;
return result; // 因为有可能this函数会有返回值return
}
call
Function.prototype.call2 = function(context) {
let context = context || window; // 因为传进来的context有可能是null
context.fn = this;
let args = [];
for (var i = 1; i < arguments.length; i++) {
args.push("arguments[" + i + "]"); // 不这么做的话 字符串的引号会被自动去掉 变成了变量 导致报错
}
args = args.join(",");
let result = eval("context.fn(" + args + ")"); // 相当于执行了context.fn(arguments[1], arguments[2]);
delete context.fn;
return result; // 因为有可能this函数会有返回值return
}
Last updated