aplicar, llamar, enlazar

  1. terreno común: 

  • Ambos son un método del objeto función, la función es cambiar el contexto cuando se ejecuta la función, es decir, cambiar el puntero de este dentro del cuerpo de la función.
var name = "lucy";
var obj = {
    name: "martin",
    say: function () {
        console.log(this.name);
    }
};
obj.say(); // martin,this 指向 obj 对象
setTimeout(obj.say,0); // lucy,this 指向 window 对象

 Nota: Como se puede ver en lo anterior, en circunstancias normales, sayel método genera una salida martin, pero lo colocamos sayen el método y lo ejecutamos como una función de setTimeoutdevolución de llamada en el temporizador. Por lo tanto, al regresar a la pila principal para su ejecución, se ejecuta en el entorno del contexto de ejecución global. En este momento, apuntar, por lo que lo que realmente necesitamos generar es apuntar al objeto. En este momento , thisnecesitamos cambiar el apuntamientowindowlucythisobjthis

setTimeout(obj.say.bind(obj),0); //martin,this指向obj对象

2. Diferencia:

  • Los tres pueden cambiar thisel objeto al que apunta la función.
  • El primer parámetro de los tres es thisel objeto al que apuntar. Si no existe tal parámetro o el parámetro es undefinedo null, apuntará al global por defecto.window
  • Los tres pueden pasar parámetros, pero applyes una matriz, call、bindpero una lista de parámetros, applyy callla suma es un parámetro entrante único, pero bindse puede dividir en múltiples entrantes
  • bindes devolver la función después de vincular esto, applyes call ejecutar inmediatamente

3. Aplicar: applyacepta dos parámetros, el primer parámetro es thisel puntero, el segundo parámetro es el parámetro aceptado por la función, la función original se ejecutará inmediatamente después de que se pase el cambio del puntero en forma de matrizthis , y este método solo cambia temporalmente thisel puntero una vez

function fn(...args){
    console.log(this,args);
}
let obj = {
    myname:"张三"
}

fn.apply(obj,[1,2]); // this会变成传入的obj,传入的参数必须是一个数组;
fn(1,2) // this指向window

Cuando  un parámetro es null, el valor predeterminado apunta a (en el navegador)undefinedwindow

fn.apply(null,[1,2]); // this指向window
fn.apply(undefined,[1,2]); // this指向window

 4. llamada: callel primer parámetro del método también es el puntero, y thisluego se pasa una lista de parámetros.Laapply función original se ejecutará inmediatamente después de cambiar thisel puntero, y este método solo cambia temporalmente thisel puntero una vez

function fn(...args){
    console.log(this,args);
}
let obj = {
    myname:"张三"
}

fn.call(obj,1,2); // this会变成传入的obj,传入的参数必须是一个数组;
fn(1,2) // this指向window

 De manera similar, cuando el primer parámetro es null, undefinedel valor predeterminado apunta a window(en el navegador)

fn.call(null,[1,2]); // this指向window
fn.call(undefined,[1,2]); // this指向window

5.bind: el método bind es muy similar a la llamada. El primer parámetro también es el puntero, y thisluego se pasa una lista de parámetros (pero esta lista de parámetros se puede pasar varias veces). thisDespués de cambiar el puntero, no se ejecutará inmediatamente, sino que devolverá una thisfunción que cambia permanentemente el puntero.

function fn(...args){
    console.log(this,args);
}
let obj = {
    myname:"张三"
}

const bindFn = fn.bind(obj); // this 也会变成传入的obj ,bind不是立即执行需要执行一次
bindFn(1,2) // this指向obj
fn(1,2) // this指向window

6. Resumen:

  • La llamada a menudo hace herencia. **Object.prototype.toString.call()** Determinar el tipo de datos
  • apply a menudo está relacionado con matrices, como la realización de los valores máximos y mínimos de una matriz con la ayuda de objetos matemáticos.
  • bind no llama a la función, pero quiere cambiar este punto, como cambiar este punto dentro del temporizador.

Supongo que te gusta

Origin blog.csdn.net/m0_71933813/article/details/129899982
Recomendado
Clasificación