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指向。