1、call方法的实现
注意eval会用toString方法处理数组,不能直接把需要的值扔进eval调用fn
var name = "时间跳跃";
var obj={
name:"听风是风"
};
function fn(a,b,c){
console.log(a+b+c+this.name);
}
//模拟call方法
Function.prototype.call_ = function(obj){
//判断是否为null或者undefined,同时考虑传递参数是不是对象情况
obj = obj? Object(obj):window;
var args = [];
for(var i=1;i<arguments.length;i++){
args.push("arguments["+i+"]");
};
obj.fn = this;//此时this指向函数fn
eval("obj.fn("+args+")")//执行fn
delete obj.fn;//删除fn
}
fn.call_(obj,"我的","名字","是")
2、apply方法的实现
Function.prototype.apply_ = function(obj,arr){
obj = obj ? Object(obj) : window;
obj.fn = this;
if(!arr){
obj.fn();
}else{
var args = [];
//这里的i从0开始
for(var i=0;i<arr.length;i++){
args.push("arr["+i+"]");
}
eval("obj.fn("+args+")")//执行fn
};
delete obj.fn
}
fn.apply_(obj,["我的","名字","是"])