Veamos primero la explicación de la llamada en MDN
El método de llamada () llama a una función o método con un valor especificado y varios valores de parámetros especificados.
NOTA: La función de este método es similar a la del método Aplicar (), con solo una diferencia, es decir, el método Call () acepta una lista de varios parámetros, mientras que el método APLICE () acepta una matriz que contiene múltiples parámetros.
gramática
Fun.call (thatesarg [, arg1 [, arg2 [, ...]]]])
parámetro
thantarg
Este valor especificado cuando la función divertida se está ejecutando. Cabe señalar que el valor especificado no significa necesariamente el verdadero valor cuando se ejecuta la función. Si esta función está en modo no riguroso, este valor especificado como nulo y indefinado apuntará automáticamente al objeto global (el objeto de la ventana en el navegador), y este valor con el valor original (número, cadena, valor booleano) apuntará al objeto de envoltura automática del valor original.
Arg1, Arg2, ...
Lista de parámetros especificados.
Los ejemplos en MDN no fueron fáciles de entender al principio. Los publiqué aquí. Si está interesado, puede consultar Call-JavaScript por usted mismo.
ThiseRg aquí se interpreta como este valor especificado cuando se ejecuta la diversión, es decir, después de usar llamadas, ¿en puntos divertidos a Thisarg? Mira el código
var p = "456"; función f1 () {this.p = "123"; } function f2 () {console.log (this.p); } f2 (); // 456 f2.call (f1 ()); // 123 f2.apply (f1 ()); // 123La primera salida es la variable global llamada. Más tarde, debido al uso de llamadas y aplicar, esto en F2 señala F1, por lo que la salida se convierte en 123. De hecho, F1 toma prestado el método de F2 y emite su propia P
En este momento, eliminar esto.p en f1 () generará tres 456, lo que confirma que cuando esto es nulo o indefinado, en realidad apunta a la variable global.
En cuanto al objeto de envoltura que apunta al valor original, ya que los objetos de envoltura que entiendo son temporales, y solo el tipo de valor original se emite durante la prueba en lugar del objeto, cómo demostrarlo aquí si alguien sabe que puede discutirlo conmigo si espera que sea discutido conmigo, ¡gracias!
Dado que la llamada puede implementar un objeto para pedir prestado otro objeto, ¿puede implementar la herencia? Mira el código
función f1 () {this.father = "padre"} function f2 () {f1.call (this); this.child = "niño"; } var test = new F2 (); console.log (test.father); //padreNo hay padre en la prueba, porque en f2 ()
f1.call (esto);
Esto aquí apunta a F2, es decir, F2 toma prestado el método de F1, que en realidad realiza la herencia.
Hablemos de los parámetros aquí. Los parámetros aquí se pasan a diversión. Veamos el código
función f1 () {this.p = "123"; } función f2 (x) {console.log (this.p); console.log (x); } f2.call (f1 (), 456); // 123 // 456La salida de 123 se debe a que P en F1, y el 456 posterior es el parámetro que pasa a F2, lo cual es fácil de entender.
Principalmente presta atención a la diferencia entre los parámetros en la llamada y la aplicación
La llamada se pasa en uno por uno, mientras que la solicitud es una matriz aprobada en
function f1 () {this.p = "test Call"; } función f2 (x, y, z) {console.log (this.p); console.log (x); console.log (y); console.log (z); } function f3 () {this.p = "test aplic"; } f2.call (f1 (), 4,5,6); f2.call (f1 (), [4,5,6]); f2.Apply (f3 (), [4,5,6]); f2.Apply (f3 (), 4,5,6);Puedes ver los resultados aquí
La primera llamada de prueba es la salida correcta
La segunda llamada de prueba se pasa en una matriz, por lo que una matriz es la primera salida y dos indefinidos
La tercera prueba de párrafo aplica la salida correcta
El cuarto párrafo informó directamente un error debido al error en el formato de parámetro
La diferencia aquí debería ser obvia