js学习-apply,call,bind的实现
2024-10-19 08:22:57
目录
apply
简单说:构建一个和调用aplly函数一样的字符串,用eval执行,完了之后删除掉,最后返回执行的结果。
Function.prototype.applyCopy = function() {
var obj = arguments[0];
obj.fn = this;
var args = arguments[1];
if(!args || args.length == 0) return obj.fn();
// obj.fn参数
var argsStr = '';
for(var i in args) {
argsStr += '"' + arguments[1][i] + '",';
}
var result = eval('obj.fn('+argsStr.replace(/,$/, '')+')');
delete obj.fn;
return result;
};
call
Function.prototype.callCopy = function() {
var obj = [].shift.applyCopy(arguments);
return this.applyCopy(obj, arguments);
}
bind
Function.prototype.bindCopy = function() {
var _this = this;
var obj = arguments[0];
return function() {
return _this.applyCopy(obj, arguments);
}
}
demo
var s = {
desc: 's.desc',
name: '你好',
}
var name = 'window';
var desc = 'window => this'
function sayHi(age, type) {
return {
name: this.name,
desc: this.desc,
age: age,
type: type
}
}
console.log(sayHi(12,'sayHi'));
console.log(sayHi.applyCopy(s, [12, 'applyCopy']));
console.log(sayHi.callCopy(s, 12, 'callCopy'));
console.log(sayHi.bindCopy(s)(12, 'bindCopy'));
总结:apply是基础,call,bind都是在apply的基础上实现的。
最新文章
- C#委托使用详解(Delegates)
- SQL SERVER四舍五入你除了用ROUND还有其他方法吗?
- OJ上 G++ 与 C++ 的区别
- ubuntu14.04安装MATLAB R2014a
- 总线(BUS)和总线操作
- visio 改变画布大小
- VB6-系统打印常识
- ANDROID_MARS学习笔记_S03_006_geocoding、HttpClient
- 执行curl -sSL 提示curl: (35) SSL connect error
- bootstrap注意事项(一)
- PHP弱类型:WordPress Cookie伪造
- 用call/cc合成所有的控制流结构
- sci-hub 下载地址更新
- gulp安装搭建前端项目自动化
- linux gzip 命令详解
- spring cloud 注册、发现、消费、负载均衡
- hdu-3397 Sequence operation 线段树多种标记
- 【总结】对FFT的理解 / 【洛谷 P3803】 【模板】多项式乘法(FFT)
- Spring WebSocket入门(一) 转载
- 软工实践Beta冲刺(5/7)