转:apply和call

转自:http://bbs.51js.com/thread-59672-1-1.html

apply:
   方法名A.apply(对象名B, [执行A需要的参数,用数组表示]);
call:
   方法名A.call(对象名B, [执行A需要的参数,用逗号分隔]);

  apply和call功能是: 执行某一个对象的方法A, 但在执行的时候临时把它内部的this指向一个别的对象B, 后面是执行A要用到的参数.
  apply和call作用一样, 区别只不过是参数一个要用数组表示, 一个要用逗号分隔的方式表示. 看例子

function obj1()
{
    this.arg = 1;
    this.M = function (a, b){ return this.arg + a + b;}
}
function obj2()
{
     this.arg = 2;
}
var k1 = new obj1();
var k2 = new obj2();

上面定义了两个对象它们都有arg这个属性, 一个为1, 一个2, 当我们执行
k1.M(10, 20) 时, 得到31, 也就是说:

k1.M(10, 20) == 31 //此时this为k1, arg为1, 这句好理解

再看语句: k1.M.apply(k2, [10, 20])

这句意思是说: 执行k1对象的M方法, 但在执行的时候把该方法内部出现的this指向k2, 同时把10, 20这2个参数传给M.

由于k1.M在执行时,内部this指向了k2, 而k2的arg属性值为2, 因此
this.arg + a + b = 2 + 10 + 20 = 32, 也就是说:

k1.M.apply(k2, [10, 20]) == 32; //因为M内部this不再指向k1, 而指向k2

要用call方法, 只需要把后面参数换成用逗号分隔的就行, 即:
k1.M.call(k2, 10, 20)
posted @ 2008-05-20 15:12  烈马狂生  阅读(322)  评论(0编辑  收藏  举报