javascript中call和apply的模拟实现

call()

call() 方法调用一个函数, 其具有一个指定的this值和分别地提供的参数(参数的列表)。

语法:fun.call(thisArg, arg1, arg2, ...)

实例:

var name="lee";
var obj={
    name:"lwf"
};
function foo(){
    console.log(this.name);
}
foo();//lee(浏览器环境)
foo.call();//lee,无参数,this默认指向window
foo.call(null);//,lee,指向window
foo.call(undefined);//lee,指向window
foo.call(obj);//lwf。有参数,this指向obj
var obj={
    name:"lwf"
};
function foo(age){
    console.log(age);
}
foo.call(obj,21);//21
var obj={
    name:"lwf"
};
function foo(age){
    return age;
}
console.log(foo.call(obj,21));//21

由此可以看到call方法的作用:

  1. 如果没有参数,或者只有一个参数,参数为null,undefined时,this指向window
  2. 如果有多个参数,并且参数不确定,第一个参数作为this绑定的对象,其余参数作为参数传入foo方法
  3. 如果foo方法有返回值,那么使用call调用后,也应该是有返回值的

    据此,我们实现了如下函数:

Function.prototype.call2=function(context){
    var context=context||window;//考虑有参数和没有参数的情况的this指向
    context.fn=this;//把调用call的方法作为指定的上下文对象的一个属性
    var args=[].slice.call(arguments,1);//取得除了上下文对象以外的参数
    var result=eval('context.fn('+args+')');//考虑有无return,执行该方法
    delete context.fn;//删除该方法
    return result;
};

类似的,apply的模拟实现:

Function.prototype.apply2=function(context){
    var context=context||window;
    context.fn=this;
    var args=arguments[1];
    var result;
    if(args){
        result=eval('context.fn('+args+')');
    }else{
        result=context.fn();
    }
    delete context.fn;
    return result;
};

参考:JavaScript深入之call和apply的模拟实现 #11

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值