考虑一下几点:
1.如果绑定的this为undefine或者null的时候,this指向运行环境的全局对象window或者glob
2.如果传递的不是对象而是一些基本类型时,this指向他的包装类
3.为了改变this指向,因为第一个参数就是this指向,那么通过第一个参数来调用函数就可以改变this的指向,但是为了不和原来的this产生冲突,可以暂时使用Symbol知名符号,后面再删去即可。
4.把key设置为不可枚举是为了再打印台不显示该Symbol知名符号
Function.prototype.myCall = function (ctx, ...args) {
ctx = ctx === undefined || ctx === null ? globalThis : Object(ctx)
let key = Symbol()
let fn = this
Object.defineProperty(ctx, key, {
value: fn,
enumerable: false
})
ctx[key](...args)
delete ctx[key]
}
测试案例:
function func(a, b) {
console.log("args", a, b)
console.log("this", this)
}
let result = func.myCall({ fn() { } }, 2, 3)
console.log(result)
//args 2 3
//this { fn: [Function: fn] }
//undefined
手写call函数解析
4879

被折叠的 条评论
为什么被折叠?



