在javascript中call讹开、apply與bind都用于改變this綁定
- bind 是返回對(duì)應(yīng)函數(shù)盅视,便于稍后調(diào)用;apply 旦万、call 則是立即調(diào)用 闹击;
var name = "window";
let obj1 = {
name: "Mitty"
}
let obj2 = {
name: 'Jim'
}
function fn(addr) {
console.log(this.name + '在' + addr);
}
// 這里的this指向的是 window
fn('瀏覽器'); // window在瀏覽器
// 改變this指向, apply、call立即調(diào)用
fn.apply(obj1, ['上海']); // Mitty在上海
fn.call(obj1, '上海'); // Mitty在上海
// bind 是返回對(duì)應(yīng)函數(shù)
let bindFn = fn.bind(obj1);
bindFn('上海') // Mitty在上海
- apply纸型、call再次調(diào)用時(shí)需要重新綁定拇砰; bind綁定后可以一直調(diào)用,強(qiáng)綁定狰腌;
// apply除破、call和bind的區(qū)別
// apply、call再次調(diào)用時(shí)需要重新綁定
fn.apply(obj1, ['上海']); // Mitty在上海
fn.call(obj1, '上海'); // Mitty在上海
// bind綁定后可以一直調(diào)用琼腔,強(qiáng)綁定
bindFn('上海') // Mitty在上海
- bind綁定的返回函數(shù)無(wú)法再次更改this指向
// 并且無(wú)法再次更改this指向,嘗試為將bind綁定后的函數(shù)重新改變到obj2
bindFn.apply(obj2, ['北京']); // Mitty在北京
bindFn.call(obj2, '北京'); // Mitty在北京
bindFn.bind(obj2)('北京'); // Mitty在北京
fn.apply(obj2, ['北京']); // Jim在北京
fn.call(obj2, '北京'); // Jim在北京
fn.bind(obj2)('北京'); // Jim在北京
總結(jié)
- call瑰枫、apply與bind都用于改變this綁定,但call丹莲、apply在改變this指向的同時(shí)還會(huì)執(zhí)行函數(shù)光坝,而bind在改變this后是返回一個(gè)全新的boundFcuntion綁定函數(shù),這也是為什么上方例子中bind后還加了一對(duì)括號(hào) ()的原因甥材。
- bind屬于硬綁定盯另,返回的 boundFunction 的 this 指向無(wú)法再次通過(guò)bind、apply或 call 修改洲赵;call與apply的綁定只適用當(dāng)前調(diào)用鸳惯,調(diào)用完就沒(méi)了,下次要用還得再次綁叠萍。
- call與apply功能完全相同芝发,唯一不同的是call方法傳遞函數(shù)調(diào)用形參是以散列形式,而apply方法的形參是一個(gè)數(shù)組苛谷。在傳參的情況下辅鲸,call的性能要高于apply,因?yàn)閍pply在執(zhí)行時(shí)還要多一步解析數(shù)組腹殿。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者