手写call函数【JavaScript】
考虑一下几点:
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 = thisObject.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