call()赚窃、bind()当娱、apply()都是用來(lái)重新定義this這個(gè)對(duì)象的。
- 比如:
let name = "小王",
age = 17;
let obj = {
name: "小張",
objAge: this.age,
myFun: function () {
console.log( `${this.name}年齡:${this.age}` );
}
};
let db = {
name: "韓梅梅",
age: 26
};
obj.myFun.call(db); //韓梅梅年齡:26
obj.myFun.apply(db); //韓梅梅年齡:26
obj.myFun.bind(db)(); //韓梅梅年齡:26
- 例子 2
let name = "小王",
age = 17;
let obj = {
name: "小張",
objAge: this.age,
myFun: function (fm, to) {
console.log( `${this.name},年齡:${this.age},來(lái)自${fm},去往${to}` );
}
};
let db = {
name: "韓梅梅",
age: 26
};
obj.myFun.call(db, "成都", "上海"); //韓梅梅,年齡:26,來(lái)自成都,去往上海
obj.myFun.apply(db, ["成都", "上海"]); //韓梅梅,年齡:26,來(lái)自成都,去往上海
obj.myFun.bind(db, "成都", "上海")(); //韓梅梅,年齡:26,來(lái)自成都,去往上海
obj.myFun.bind(db, ["成都", "上海"])(); //韓梅梅,年齡:26,來(lái)自成都,上海,去往undefined
以上出了 bind 方法后面多了個(gè) () 外 考榨,結(jié)果返回都一致!
由此得出結(jié)論鹦倚,bind 返回的是一個(gè)新的函數(shù)河质,你必須調(diào)用它才會(huì)被執(zhí)行。
從上面四個(gè)結(jié)果不難看出:
call 震叙、bind 掀鹅、 apply 這三個(gè)函數(shù)的第一個(gè)參數(shù)都是 this 的指向?qū)ο?/em>,第二個(gè)參數(shù)差別就來(lái)了:
call 的參數(shù)是直接放進(jìn)去的媒楼,第二第三第 n 個(gè)參數(shù)全都用逗號(hào)分隔乐尊,直接放到后面 obj.myFun.call(db, '成都', ... , 'string' )。
apply 的所有參數(shù)都必須放在一個(gè)數(shù)組里面?zhèn)鬟M(jìn)去 obj.myFun.apply(db, ['成都', ..., 'string' ])划址。
bind 除了返回是函數(shù)以外扔嵌,它 的參數(shù)和 call 一樣。
當(dāng)然夺颤,三者的參數(shù)不限定是 string 類型痢缎,允許是各種類型,包括函數(shù) 世澜、 object 等等独旷!