1、call()
调用这个函数并修改函数运行时的this指向。
fun.call(thisArg,arg1,arg2,,,)
参数:thisArg:当前调用函数this的指向对象;
arg1,arg2:传递的其它参数
注意:是更改 fun函数内部的 this 指向 thisArg函数,此时 fun函数 内部的this相当于 thisArg函数内部的this。
例子:
//1 父构造函数
function Father(uname,age){
//this 指向父构造函数的对象实例
this.uname=uname;
this.age=age;
}
//2 子构造函数
function Son(name,age,score){
//this 指向子构造函数的对象实例
Father.call(this,name,age);
//上面一句相当于增加了下面两句:
//this.name=name;
//this.age=age;
this.score=score;
}
var son=new Son('小明',21,99);
打印 son:
2、apply()方法
和call方法相似,调用一个函数,可以改变函数的this指向。
fun.apply(thisArg,[argsArray])
参数:thisArg:在fun函数运行时指定的this值;
argsArray:传递的值,包含在数组里面;
返回值就是函数的返回值,因为它就是调用函数。
apply的主要应用:
如 :利用apply 借助数学内置对象求最大值(最小值):
var arr=[1,44,3,66,9];
Math.max.apply(Math,arr); //指回Math
Math.min.apply(Math,arr);
3、bind()方法
不会调用方法,但会改变函数内部 this 指向。
fun.blind(thisArg,arg1,arg2,...)
参数:thisArg:在fun函数运行时指定的this 值;
arg1,arg2:传递的其他参数;
返回由指定的this值和初始化参数改造的原函数拷贝。(返回一个函数)
应用:如果有的函数不想立即调用,但又想改变函数内部的this指向,此时用 bind。
总结:
相同点:都可以改变函数内部this指向;
区别:
1)call和apply会调用函数,并改变函数内部this指向;
2)call和apply传递的参数不一样,call传递arg1,arg2...形式,apply传参必须数组形式;
3)bind不会调用函数,可以改变函数内部this指向。
主要应用场景:
1)call经常用于继承;
2)apply经常与数组有关,比如借助Math对象求数组的最大最小值;
3)bind应用比如改变定时器内部的this指向。