call
函數(shù)是用來改變調(diào)用者的this
指針:
function f() {
console.log(this)
}
f() // window
let obj = { a: 1 }
f.call(obj) // { a: 1 }
f.call(obj)
的原理就是把f
函數(shù)掛載到obj
上痴施,執(zhí)行obj.f()
的時候抗斤,f
中的this
就指向了obj
肾筐。根據(jù)這個原理枫疆, 我們可以來實(shí)現(xiàn)自己的 myCall
函數(shù) :
Function.prototype.myCall = function (obj) {
var obj = obj ? Object(obj) : window // obj可能不是一個對象 所以用Object()包裹下
obj.fn = this // 當(dāng)執(zhí)行 f.myCall() 時, myCall()里的 this 指向 f
var arg = [...arguments].slice(1) //取出除了obj以外的其他參數(shù)
var result = obj.fn(...arg)
return result
}
其中比較難理解的就是 obj.fn = this
棋枕, 這行代碼的意思就是把f.call(obj)
中的f
函數(shù)掛載到obj
上白修。當(dāng)執(zhí)行f.myCall()
時, myCall
里的 this
指向 調(diào)用者f
重斑,所以這里的this
就是f
函數(shù)熬荆。