看案例不是太明白call()方法,所以去搜了下,原来它还有个类似的方法~
ECMAScript规范给所有函数都定义了call()和apply()两个方法,call与apply的第一个参数都是需要调用的函数对象 ,在函数体内这个参数就是this的值,剩余的参数都是需要传递给函数的值,call与apply的不同就是call传的值可以 是任意的(直白说法’连续参数’),而apply传的剩余值必须为数组(直白说法’数组参数’)。
这两个方法都是为了改变某个函数运行时的context即上下文而存在的,换句话说,就是为了改变函数体内部this的指 向(动态改变this),
如:
function add(a,b){return a+b}
function sub(a,b){return a-b}
/apply方法
var a1 = sub.apply(add,[4,2]);
var a2 = add.apply(sub,[4,2]);
/
var a1=sub.call(add.4,2);
var a2=add.call(sub,4,2);
输出结果:a1=2,a2=6
怎么感觉好像一样的~ 网上找了下给出这个结果
javascript中,某个函数的参数数量是不固定的,因此要说只用条件的话,当你的参数是明确知道数量时,用call, 而不确定的时候,用apply,然后把参数push进数组传递进去,当参数数量不确定时,函数内容也可以通过arguments这个数组来遍历所有参数。
这个应该靠谱点吧~
再来看下下面这个
如:
function fn1(){
this.a=123;
this.add=function(){return this.a}
}
function fn2(){this.a=456;}
var f1=new fn1();
var f2=new fn2();
var a=f1.add.call(f2);//a输出的是456
这里就是把f1的方法拿给分来使用,f2便可以使用f1中所有的方法,当然根据综上可以扩展出多继承,使用多个call
便可以实现多继承
如:
function fn1(){this.add=function(){return this.a}}
function fn2(){this.sub=function(){return this.a-this.b}}
function fn3(){
this.a=10;
this.b=2;
fn1.call(this);
fn2.call(this);
}
var f3=new fn3();
console.log(f3,add());//10
console.log(f3.sub());//8
还有种说法是this和arguments理解了,这两个就不攻自破了~