前言:
1:call的作用:指定函数的调用者,(就是指定它可触及的作用域?此处理解不到位)
2:call实际的用法(记住下面这个写法,我把它标记为:【前言2】):
fn.call(thisObj, arg1, arg2,...)
//fn 被thisObj调用,可以获取thisObj中的变量,用this指代thisObj。
手写一个CALL:
Function.prototype.myCall = function(fnCaller){
// 入参是指定调用者
if(typeof this!='function'){return}
//此处的this是【前言2】的fn,想想是不是?
let args = [...arguments].slice(1)
// 上述的取最终传入的参数,这个没什么可说的
let result;
let acturalCaller;
acturalCaller = fnCaller||window;
//这个实际调用fn的对象就是传入的第一个参数,如果没传入,默认就是全局对象,如果是node则是global
acturalCaller.fn = this
//此处的this是【前言2】的fn,想想是不是?再说一遍,最终实际执行的可不就是fn么?下一行代码就是这个意思
result = acturalCaller.fn(...args )
delete acturalCaller.fn
// 做个清理动作,以免污染环境
return result
//把最终执行结果反回去,其实只有不是null才返回,对吧?
}