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

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);
    }
}
posted on 2013-04-27 11:18  花森  阅读(298)  评论(0编辑  收藏  举报