La sintaxis de JavaScript es flexible, y no es raro tener cinco o seis métodos de implementación para la misma función. Luego, junto con una herencia prototipo antihumana y características asincrónicas, es aún más confuso. A menudo no entiendo la diferencia entre la llamada y la solicitud, por lo que la grabaré hoy para evitar olvidarla nuevamente.
En JavaScript, los métodos se pueden ejecutar de las siguientes maneras:
1.Func () es la forma de llamar más directa y común, y también se ajusta a la lógica de pensamiento de la gente común, pero en algunos casos hay algunas deficiencias, que se explicarán a continuación.
2. (función (arg) {}) (ventana), una llamada de método anónimo, es más útil al construir un espacio de nombres. Los parámetros en los siguientes soportes corresponden a los parámetros entrantes en el método anónimo uno por uno.
3.func.bind (sth) (). El manual de Mozilla menciona que Bind es una nueva característica agregada en ECMA-262 5th Edition. Se enumera por separado como un método de llamadas porque compensa el defecto que el alcance no puede estar obligado en llamadas directas.
4.func.call (), esta es la segunda forma de llamar. Cada método tiene un método de llamada definido en el prototipo para ejecutar el método actual.
5.func.apply (), el hermano gemelo de llamadas.
func ()
Esta es la forma más común de llamar y se puede ver en todas partes en cualquier idioma. Func (x, y) puede pasar en diferentes parámetros. En algunos idiomas, como PHP, Java, este tipo de llamada es suficiente para resolver todos los problemas. Pero JavaScript es un lenguaje funcional, y el concepto de cierres y una palabra clave extraña que determinan las deficiencias de esta forma de llamar. Esto debe interpretarse como el alcance del segmento de código actual, que cambiará a medida que el código se ejecute a diferentes fragmentos. Sin embargo, en algunos casos no queremos que esto se cambie, como eventos vinculados a ciertos DOM. Definitivamente no queremos que esto se transfiera al objeto de la ventana cuando se les llama, pero a veces esto es cierto, por ejemplo, el siguiente código.
La copia del código es la siguiente:
var a = {};
var func = function (x) {
console.log (esto);
};
a.OnClick = function () {
var x = 100;
func (x);
};
A.Onclick ();
Puedes pensar en un enlace en la página. Dado que solo queremos unir el método definido al evento OnClick en lugar de llamarlo de inmediato, y este método tiene un parámetro, necesitamos concluir con un método anónimo y pasarlo al evento OnClick de a. Esto tiene un problema. Esto en FUNC se convierte en la ventana de objeto global, obviamente no queremos esto. En este momento, no es posible usar func () como método de llamada directa, por lo que debemos vincular esto fuera de FUNC al método FUNC. Entonces hay un método BIND, LLAME, Aplicar.
unir
El propósito del enlace es muy simple, devolviendo el mismo método que une este objeto. El código anterior puede lograr el propósito de vincular esto en el objeto A modificando una línea.
La copia del código es la siguiente:
var a = {};
var func = function (x) {
console.log (esto);
};
a.OnClick = function () {
var x = 100;
func.bind (this) (x); // Bing aquí
};
A.Onclick ();
De esta manera, este evento OnClick no funcionará como una mosca sin cabeza.
llamar y aplicar
Llamar y aplicar debe hablar juntos porque son muy similares. Todos admiten múltiples parámetros, y el primer parámetro es este objeto que estará vinculado, y el segundo parámetro es su diferencia. Call utiliza parámetros independientes como parámetros de invocación, y aplicar usa una matriz como parámetros de invocación. A veces no queremos cambiar este objeto, pero queremos unirlo artificialmente a otros objetos. En este momento, llamar y aplicar son muy útiles. (No es que no pueda usar Bind, pero parece que Bind parece tarde, por lo que la compatibilidad del navegador puede ser pobre). Toma una castaña:
La copia del código es la siguiente:
a = {
func: functer () {
this.x += 1;
},
X: 0
};
b = {
A: A,
X: 20
};
para (var i = 0; i <10; i ++) {
bafunc ();
}
console.log (ax);
console.log (bx);
Hay X en los objetos A y B arriba. Esperamos que FUNC pueda modificar la X correspondiente de manera específica, pero la llamada directa solo puede modificar X en el alcance de FUNC, es decir, AX. Modificar el código para lograr el propósito de modificar BX
La copia del código es la siguiente:
a = {
func: functer () {
this.x += 1;
},
X: 0
};
b = {
A: A,
X: 20
};
para (var i = 0; i <10; i ++) {
Bafunc.call (b); // unir esto a B
}
console.log (ax);
console.log (bx);
Este castaño no está bien recibido, y es un estilo de código muy confuso, con escenarios aplicables, pero no está disponible en todas partes.