Escritura a mano llamada, se aplican y función se unen

En primer lugar, a partir de los siguientes puntos a considerar cómo implementar estas funciones:

  • El primer parámetro no se pasa, entonces el contexto predeterminado para la ventana;
  • Cambiado este punto, por lo que el nuevo objeto puede realizar esta función, y puede aceptar parámetros.

Así que nos llame primero en lograr

Function.prototype.myCall = function(context) {
  if (typeof this !== 'function') {
    throw new TypeError('Error')
  }
  context = context || window
  context.fn = this
  const args = [...arguments].slice(1)
  const result = context.fn(...args)
  delete context.fn
  return result
}

análisis:

  • En primer lugar, el contexto es opcional, si usted no pasa, entonces el contexto predeterminado para la ventana;
  • A continuación, cree una propiedad fn al contexto, y establezca el valor en función de la necesidad de llamada;
  • Debido a que el número de llamada de los parámetros se puede pasar como un parámetro para una llamada de función, que necesita ser despojado parámetros, y entonces llama a la función de la función y objeto deleción (porque el objeto en sí no es la función, pero en el volumen de suministro llamada, hacer que una propiedad temporal).
    La idea es lograr la llamada anterior, se aplica la aplicación es similar, excepto que los parámetros de procesamiento, no es uno de los análisis de las ideas.
Function.prototype.myApply = function(context) {
  if (typeof this !== 'function') {
    throw new TypeError('Error')
  }
  context = context || window
  context.fn = this
  let result
  // 处理参数和 call 有区别
  if (arguments[1]) {
    result = context.fn(...arguments[1])
  } else {
    result = context.fn()
  }
  delete context.fn
  return result
}

se unen aplicación en comparación con otras dos funciones son un poco más complicado, debido a la necesidad de volver una función de enlace, es necesario determinar el número de asuntos fronterizos, los siguientes son implementación de vinculación:

Function.prototype.myBind = function (context) {
  if (typeof this !== 'function') {
    throw new TypeError('Error')
  }
  const _this = this
  const args = [...arguments].slice(1)
  // 返回一个函数
  return function F() {
    // 因为返回了一个函数,我们可以 new F(),所以需要判断
    if (this instanceof F) {
      return new _this(...args, ...arguments)
    }
    return _this.apply(context, args.concat(...arguments))
  }
}

análisis:

  • Y los primeros pasos antes de la implementación casi, no entra en detalles.
  • se unen devuelve una función, se invoca una función de dos maneras, uno se llama directamente, uno es el nuevo camino a través de la forma en que primero se llama directamente;
    • Para llamadas directas, aquí se optó por aplicar las formas, pero los parámetros hay que prestar atención a lo siguiente: se unen porque dicho código puede lograr f.bind similar (obj, 1) (2), por lo que necesitamos a ambos lados del empalme argumento hasta, por lo que es esta args.concat realización (... argumentos);
    • Por último, es a través de nuevas formas, en este caso, no va a haber ningún cambio de esta manera, por lo que para ello tenemos que ignorar la función de retorno de este.

Otra aplicación de Referencia

UFI
Publicado 16 artículos originales · ganado elogios 2 · Vistas 1190

Supongo que te gusta

Origin blog.csdn.net/qq_39075021/article/details/104331887
Recomendado
Clasificación