代码改变世界

call方法、apply方法、caller属性和callee属性

2012-07-09 09:51  江苏黑马  阅读(1232)  评论(0)    收藏  举报
  1. call方法。
    call([thisObj[,arg1[, arg2[, [,.argN]]]]])
    参数
    thisObj
    可选项。将被用作当前对象的对象。
    arg1, arg2, , argN
    可选项。将被传递方法参数序列。
    说明
    call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

    如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
    举一个具体的例子:
    function add(a,b)
    {
        alert(a+b);
    }
    function sub(a,b)
    {
        alert(a-b);
    }
    
    add.call(sub,3,1); 

    这个例子中的意思就是用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); // 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。

  2. apply方法。
    这两个方法基本上是一个意思
    区别在于 call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组。obj.fun.apply(obj1,arguments) 获得的是obj1(arguments)的调用。也就是说即使obj1不具备该方法,比如 Array.slice.apply(obj1,argument) 中,obj1不具备array类才有的slice(分割字符串)方法,但是这里可以让他得到这个方法
  3. caller属性。指用本函数的调用语句所在的作用域的创建函数,仅在函数在另一个函数内被调用时有效,若函数在顶级作用域内被调用,有:caller==null (注意:这里的调用是指一个函数在另一个函数内被调用,强调的是函数运行的位置,而非函数被哪个对象所调用)
    function a(){ alert(a.caller); }
    
    function b(){ a(); }
    
    b();  // a函数弹出function b(){ a(); }
    
    a(); //a函数弹出 null
  4. callee属性。arguments.callee 指向函数自身,因此函数递归可以这样写:
    function c(){  arguments.callee();  }

    看如下callee实例:

    function getOffset(elem){
               if(typeof arguments.callee.offset=="number"){
                       
               }
    }

    arguments.callee表示函数自身也就是getOffset;
    arguments.callee.offset则是表示offset是getOffset的属性,因为在javascript中函数也是对象,可以有属性和方法。这句话的意思就是获取函数getOffset的offset值。
    function.caller 和arguments.callee是只读的,不能通过修改这个属性来改变函数自身。