一直沒(méi)看懂Function.call() apply() bind(),今天研究了下,大概明白了。但是詳細(xì)的還是不明白。
先講講已經(jīng)明白的:
作用:
劫持某個(gè)對(duì)象,使原先的方法fun中可以調(diào)用劫持對(duì)象的方法和屬性;可以直接使用param1,param2...
使用方法:
fun.call(劫持的對(duì)象,param1,param2,param3,...);
fun.apply(劫持的對(duì)象,[param1,param2,param3,...]);
fun.bind(劫持的對(duì)象,[param1,param2,param3,...])();
三個(gè)方法的作用是一樣的。唯一的區(qū)別就是參數(shù)的傳遞形式不一樣。第一個(gè)參數(shù)劫持的對(duì)象是fun方法里面的this要指向的地方,必填。其他的參數(shù)非必填。注意bind后面有一個(gè)括號(hào)
代碼示例:
var objLi = {
name:'小李子obj',
age: 30,
myFun:function(one,two){
// console.log(this,'myFun里的this 僅指objLi');
console.log('this.name : '+this.name+' this.age年齡:'+this.age,' one參數(shù)is ',one,' 參數(shù)two是 ',two);
}
}
console.log(objLi.age,'====objLi age');
objLi.myFun('one','two');
var db={ name:'小甜甜', age:20 };
console.log('fun call apply bind無(wú)參數(shù) ↓↓↓↓↓↓↓↓↓↓')
objLi.myFun.call(db);
objLi.myFun.apply(db);
objLi.myFun.bind(db)();
console.log('fun call apply bind都有參數(shù) ↓↓↓↓↓↓↓↓↓↓')
objLi.myFun.call(db,'callOne','callTwo');
objLi.myFun.apply(db,['applyOne','applyTwo']);
objLi.myFun.bind(db,['bindOne','bindTwo'])();

打印結(jié)果,注意bind的打印參數(shù).png
經(jīng)典案例 Math.max.apply
var tmpArray = [1,2,3,4,5,3,2,1];
var tmpMax = Math.max(...tmpArray);
console.log('最大值是 ',tmpMax); //最大值是 5
var tmpMaxApply = Math.max.apply(null,tmpArray); //這里的null也可以寫(xiě)成Math
console.log('最大apply值是 ',tmpMaxApply); //最大apply值是 5
關(guān)于Math.max(...tmpArray),是最新的擴(kuò)展語(yǔ)句
spread operator
案例:數(shù)組push

array使用apply.png
上圖中array使用apply方法,意思就是:
在push方法中,this指向了arr1,向arr1中添加arr2中的值