JS 中的call,apply,bind 和 caller, callee

  • call,apply,bind都是Function里面原生支持的方法,是JavaScript引擎内在实现的,每个Function的实例都有这三个属性。
call() 和 apply() 的用法很相似,只是调用的时候传递参数的方式有些区别:
call():function.call(object, arg1,arg2...),
apply():function.apply(object, [arg1,arg2,...]),apply方法传递的是一个参数数组,所以有时候直接传个 arguments 就可以。
注:这里的object就是该function里面的this,这也是js一个神奇的地方,可以随意修改一个方法的this。

  •  bind 跟call,apply的区别是:call,apply都是立刻执行的,不能用于函数申明或绑定事件里面。
比如说 dom.onclick = function.apply(object, [......]) 这种方式是要报错的。解决的办法就是使用 bind,bind的用法:dom.onclick = function.bind(object)。因为bind返回的是一个函数引用,所以只需要传递一个function调用时,绑定的对象即可,不再传递该函数调用时需要的实参。

  •  caller 和 callee
           (1)caller 返回的是一个调用了该函数的函数,即是一个函数的引用。caller属性只有在函数执行时才有定义。
function callerDemo() {
    if ( callerDemo.caller) {
        var a= callerDemo.caller.toString();
        console.log(a);
    } else {
        console.log("this is a top function");
    }
}
function handleCaller() {
    callerDemo();
}
callerDemo();   // 输出的是handleCaller这个函数的引用

 (2)callee 返回正在被执行的函数对象,调用方法:[function.]arguments.callee,该属性经常被用于递归。需要注意的是callee拥有length属性,这个属性有时候用于验证还是比较好的。 arguments.length是实参长度,arguments.callee.length是形参长度,由此可以判断调用时形参长度是否和实参长度一致。
var sum = function(n){
    if(n <= 0){
        return 1;
    }else{
        return n  + arguments.callee(n - 1);    
        // return n + sum(n - 1);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值