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

本文详细解析了JavaScript中call、apply、bind、caller和callee五个方法的用途与区别,特别是如何通过call、apply、bind在不同场景下灵活地改变函数执行时的this指向,以及如何利用caller和callee来追踪调用关系。通过实例演示,读者能够清晰地理解这些方法在实际开发中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

转载于:https://www.cnblogs.com/zyc-undefined/archive/2013/04/27/3153220.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值