js 自己写一个call的实现

125 阅读1分钟

前言:

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才返回,对吧?
}