javascript中的call

// call 的特点
// 1)可以改变当前函数的this指向
// 2)还会让当前函数执行
// 3)第一个参数改变当前参数的this,后面的参数在当前参数的arguments获取

// function fn1() {
//   console.log(this,arguments)
// }
// fn1.call('hello',1,2,3,4)
// function fn1() {
//   console.log(1)
// }
// function fn2() {
//   console.log(2)
// }
// fn1.call.call.call(fn2)  // 2 执行了fn2

Function.prototype.call = function (context) {
  context = context ? Object(context) : window;
  context.fn = this;   // 让传入的this.fn执行,相当于fn的this指向的是.前面的,也就是传入的this
  let args = [];
  for (let i = 1; i < arguments.length; i++) {
    args.push('arguments[' + [i] + ']')
  }  // args = ["arguments[1]","arguments[2],"arguments[3]""]
  let r = eval('context.fn(' + args + ')');
  delete context.fn;
  return r
}
function fn1() {
  console.log(1)
}
function fn2() {
  console.log(2)
}
fn1.call('hello', 1, 2, 3, 4, 5);
fn1.call.call.call(fn2);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容