La diferencia entre llamar, aplicar y enlazar en JavaScript

1. La diferencia entre call, apply y bind

llamar:

Llame a la función, cambie el puntero this en la función, reciba la lista de parámetros pasados ​​y devuelva el valor de retorno de la función

fun.call(thisArg, arg1, arg2, ...)

thisArg: el valor this especificado cuando se ejecuta la función fun

arg1, arg2, ...: argumentos adicionales pasados

    var o = {
      name: 'zs'
    }
    function fun() {
      console.log(this)
    }
    fun()  //this指向window
    fun.call()  //this指向window
    fun.call(o)  //调用call方法改变了this指向o这个对象
    var o = {
      name: 'zs'
    }
    function fun(a, b) {
      console.log(this)  //调用call方法改变了this指向o这个对象
      console.log(a + b)  //3
    }

    fun.call(o, 1, 2) //传递了参数时,可以参与运算

Escenario de uso: Implementación de la herencia

    function Father(name, age) {
      this.name = name
      this.age = age
    }
    function Son(name, age) {
      Father.call(this, name, age)
    }
    let son = new Son('zs', 18)
    console.log(son)  //Son {name: 'zs', age: 18}

aplicar:

Llame a la función, cambie el puntero this en la función, reciba la matriz pasada y devuelva el valor de retorno de la función

fun.apply(thisArg, [argsArray])

thisArg: el valor this especificado cuando se ejecuta la función fun

[argsArray]: el valor pasado debe incluirse en la matriz

    var o = {
      name: 'zs'
    }
    function fun(arr) {
      console.log(this)  //调用apply方法改变了this指向o这个对象
      console.log(arr)  //ls
    }

    fun.apply(o, ['ls'])

Escenario de uso: por ejemplo, puede usar apply para encontrar el valor máximo con la ayuda de objetos matemáticos integrados

    var arr = [1, 56, 23, 78, 64, 19]
    var max = Math.max.apply(Math, arr)
    //调用求数组里面求最大值   让this指向函数的调用者Math
    var min = Math.min.apply(Math, arr)
    console.log(`最大值是${max}`)
    console.log(`最大值是${min}`)

unir:

No llamará a la función, cambiará este punto en la función y devolverá una función (la nueva función después de la función original cambia este punto)

 fun.bind(thisArg, arg1, arg2, ...)

thisArg: el valor this especificado cuando se ejecuta la función fun

arg1, arg2, ...: argumentos adicionales pasados

    var o = {
      name: 'andy'
    }
    function fun() {
      console.log(this)
    }
    var fn = fun.bind(o)
    fn() //调用bind方法改变了this指向o这个对象

Escenario de uso: cuando solo queremos cambiar el punto de esto y no queremos llamar a esta función, podemos usar bind

Hay varios botones que deshabilitan este botón después de dos segundos y habilitan esta función cuando se hace clic

    let btns = document.querySelectorAll('button')
    for (let i = 0; i < btns.length; i++) {
      btns[i].addEventListener('click', function () {
        this.disabled = true
        setTimeout(function () {
          this.disabled = false
          // 定时器里面的this指向的是window并不是按钮,这个时候就需要改变this的指向,让this指向按钮
        }.bind(this), 2000)
      })
    }

2. El problema señalado por esto:

  • En la función de flecha, esto apunta a esto debajo del área donde se declara
  • En el ámbito global, esto apunta a la ventana
  • En una función normal, esto apunta a su llamador
  • Enlace de eventos, esto apunta a la fuente del evento
  • Temporizador, esto apunta a la ventana
  • Constructor, esto apunta al objeto instanciado.

Supongo que te gusta

Origin blog.csdn.net/weixin_70443954/article/details/128173439
Recomendado
Clasificación