這幾天在看別人的代碼的時(shí)候填大,發(fā)現(xiàn)大神把a(bǔ)pply、call俏橘、bind允华,用的出神入化。感覺自己需要整理一波寥掐。今天把自己的心得靴寂,整理一下。持續(xù)更新召耘。
- 了解一個(gè)東西的第一步查手冊百炬。
手冊
apply
方法在指定 this值和參數(shù)的情況下調(diào)用某個(gè)函數(shù)
-
例:
var person = { name:'zhaobw' } var student = { name:'tom' } function Out(){ console.log(this.name); } Out.apply(person); Out.apply(student);
call
方法在指定 this值和參數(shù)的情況下調(diào)用某個(gè)函數(shù)
-
例
var person = { name:'zhaobw' } var student = { name:'tom' } function Out(){ console.log(this.name); } Out.call(person); Out.call(student);
問題來了,這兩個(gè)方法功能不是一樣的么?
是的污它,他們是一樣的剖踊!有一點(diǎn)點(diǎn)區(qū)別,就是第二個(gè)參數(shù)
只有一個(gè)區(qū)別衫贬,就是call()方法接受的是若干個(gè)參數(shù)的列表德澈,而apply()方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組。
bind
創(chuàng)建一個(gè)新的函數(shù), 當(dāng)被調(diào)用時(shí)固惯,它的this關(guān)鍵字被設(shè)置為提供的值 圃验,在調(diào)用新函數(shù)時(shí),提供任何一個(gè)給定的參數(shù)序列缝呕。
var person = {
name:'zhaobw'
}
var student = {
name:'tom'
}
function Out(){
console.log(this.name);
}
var p1 = Out.bind(person);
var s1 = Out.bind(student);
p1();
s1();
三個(gè)函數(shù)進(jìn)行對比
- 都是用來改變函數(shù)的this對象的指向的澳窑;
- 第一個(gè)參數(shù)都是this要指向的對象;
- 都可以利用后續(xù)參數(shù)傳參供常;
- bind是返回對應(yīng)函數(shù)摊聋,便于稍后調(diào)用,apply栈暇、call是立即調(diào)用麻裁;
概念都說了。舉幾個(gè)例子源祈。
- 選出一個(gè)數(shù)組最大的數(shù)字煎源,利用了apply參數(shù)是數(shù)組的方便。
var arr = [1,2,3,4,5,6,7];
console.log(Math.max.apply(Math,arr));
- 判斷一個(gè)對象是不是數(shù)組
function isArray(obj){
return Object.prototype.toString.call(obj) === '[object Array]' ;
}
- 判斷一個(gè)對象是不是數(shù)組
console.log(asd instanceof Array);