call和apply的区别就是第二个参数 call是返回无数个参数拼接而apply是传入一个类数组
关于手写call和apply主要就是考验this的指向问题
这里有一个注意点:
在非严格环境下,如果call和apply的第一个参数是null或者是undefined则this指向window
es6实现call
Function.prototype.myCall = function (obj, ...args) {
// 数据校验
if ([undefined, null].includes(obj)) {
obj = window
} else {
obj = Object(obj) //如果是简单数据类型,则使用他的包装对象包装一层
}
//存储一下当前函数
const fn = this
// 将当前函数绑定到要执行的对象的某个属性上,这样一来直接调用对象的属性,则就可以完成this指向
// 创建一个独一无二的基础数据类型,防止污染到obj
const methods = Symbol('methods')
// 将这个方法绑定到obj的methods属性上
obj[methods] = fn
delete obj[methods]; //删除临时方法
return obj[methods](...args)
}