call、apply、bind的模拟实现

call、apply、bind的模拟实现

Call

call() 方法在使用一个指定的 this 值和若干个指定的参数值的前提下调用某个函数或方法。

call方法用于改变this指向,一共有两个参数:第一个参数为需要指定的this值,第二个参数为一个参数列表。

func.call(context,arg1,arg2,...);
实现
Function.prototype.myCall = function (context, ...rest) {
  var context = context || window;
  context.fn = this;
  var result = context.fn(...rest);
  delete context.fn;
  return result;
}

apply

apply() 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。

与call类似,区别在于apply第二个参数是传递数组;

func.apply(context,[argArr]);
实现
Function.prototype.myApply = function (context, arr) {
  var context = context || window;
  context.fn = this;
  var result;
  if (!arr) {
    result = context.fn();
  } else {
    result = context.fn(...arr);
  }
  delete context.fn;
  return result;
}
注意

​ call和apply函数使用时,context为null时,指向window;调用两个方法,func立即执行;

bind

**bind()方法创建一个新的函数,在bind()**被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用。

实现
Function.prototype.myBind = function (context, ...arr) {
  var that = this;
  var context = context || window;
  return function (...selfParam) {
    return that.call(context, ...arr, ...selfParam)
  }
}

你可能感兴趣的:(JS)