JavaScript es más informal en comparación con otros lenguajes de programación, por lo que el código JavaScript está lleno de todo tipo de métodos de escritura extraños. A veces puedes ver flores en la niebla. Por supuesto, poder comprender varios tipos de métodos de escritura también es una comprensión más profunda de las características del lenguaje JavaScript.
(function () {...}) () y (function () {...} ()) son dos formas comunes de ejecutar funciones inmediatamente en JavaScript. Al principio pensé que era una función anónima envuelta en un soporte, y luego agregué un soporte para llamar a la función. Finalmente, logré el propósito de ejecutarlo inmediatamente después de definir la función. Más tarde, descubrí que la razón para agregar corchetes no era el caso. Para comprender la ejecución de funciones de inmediato, primero debe comprender algunos conceptos básicos de funciones.
Declaraciones de funciones, expresiones de funciones, funciones anónimas
Declaración de funciones: función fnname () {...}; Use la palabra clave de función para declarar una función y luego especifique un nombre de función, llamada declaración de función.
Function Expression var fnname = function () {...}; declare una función utilizando la palabra clave de función, pero no nombra la función. Finalmente, a la función anónima se le asigna una variable, llamada expresión de función, que es la forma más común de sintaxis de expresión de función.
Función anónima: function () {}; Use la palabra clave de función para declarar una función, pero la función no se nombra, por lo que se llama función anónima. Las funciones anónimas pertenecen a expresiones de funciones. Las funciones anónimas tienen muchas funciones. Si asigna una variable, crea una función, y si asigna un evento, se convierte en un controlador de eventos o crea un cierre, etc.
La diferencia entre la declaración de función y la expresión de la función es que 1. Al analizar el código JavaScript, el motor JavaScript 'Funcion Declaration Promotion' (Declaración de funciones Alusar) Declaración de función en el entorno de ejecución actual (alcance). La expresión de la función debe esperar hasta que el motor Javascirtp se ejecute a su línea antes de analizar la expresión de la función de la línea superior a la línea inferior. 2. La expresión de la función se puede llamar inmediatamente con los soportes después de la expresión de la función. La declaración de función no se puede hacer y solo se puede llamar en forma de fnname (). Aquí hay dos ejemplos de las diferencias entre los dos.
fnname (); function fnname () {...} // normal, porque 'promocionando' la declaración de función, las llamadas de función pueden ser fnname (); var fnname = function () {...} // Se informa un error, la variable fnname no ha guardado una referencia a la función, y la llamada de función debe ser después de la expresión de función de la función var fnname = function () {alert ('Hello World');} (); // se agregan parcelas después de la expresión de la función. Cuando el motor JavaScript analiza aquí, la función se puede llamar a la función inmediatamente fnname () {alerta ('Hello World');} (); // No habrá un error, pero el motor JavaScript solo analiza la declaración de la función, ignora los paréntesis posteriores, y la declaración de función no se llamará a la función () {Console.log ('Hello World'); } (); // El error de sintaxis, aunque las funciones anónimas pertenecen a expresiones de funciones, no se realiza una operación de asignación, // por lo que el motor JavaScript trata la palabra clave de función al principio como una declaración de función e informa un error: se requiere un nombre de funciónDespués de comprender algunos conceptos de funciones básicas, miré hacia atrás en las dos formas de escribir (function () {...}) () y (function () {...} ()) de inmediato. Al principio pensé que era una función anónima envuelta en un soporte y agregué un soporte para llamar a la función de inmediato. En ese momento, no sabía por qué tenía que agregar corchetes. Más tarde me di cuenta de que si tuviera que agregar corchetes después del cuerpo de la función, podría llamarlo de inmediato. Entonces esta función debe ser una expresión de función, no una declaración de función.
(function (a) {console.log (a); // Firebug Salida 123, use el operador ()}) (123); (función (a) {console.log (a); // Firebug output 1234, use el operador ()} (1234)); ! function (a) {console.log (a); // Salida de Firebug 12345, ¡use! Operador} (12345); +función (a) {console.log (a); // Salida de Firebug 123456, use el operador +} (123456); -función (a) {console.log (a); // Salida de Firebug 1234567, use el - operador} (1234567); var fn = function (a) {console.log (a); // Salida de Firebug 12345678, usa el = operador} (12345678)¡Puede ver el resultado de salida y agregarlo antes de la función! , +, - e incluso las comas se pueden usar para ejecutar inmediatamente después de definir la función, y (),! Operadores como +, -, = convertir las declaraciones de funciones en expresiones de funciones, eliminando la ambigüedad entre el motor JavaScript que identifica expresiones de funciones y declaraciones de funciones, diciéndole al motor JavaScript que esta es una expresión de funciones, no una declaración de función, puede agregar paréntesis después de él y ejecutar el código de la función de inmediato.
Agregar entre paréntesis es la forma más segura de hacerlo, ¡porque! Los operadores como, +y - también realizarán operaciones con el valor de retorno de la función, lo que a veces causa problemas innecesarios.
Pero, ¿de qué sirve escribir de esta manera?
No hay concepto de alcance privado en JavaScript. Si declara algunas variables en el alcance global o local en un proyecto desarrollado por varias personas, otros pueden ser sobrescritos por otros con el mismo nombre. Según las características de la cadena de alcance de las funciones de JavaScript, esta técnica se puede utilizar para imitar un alcance privado y usar una función anónima como un "contenedor". El "contenedor" puede acceder a variables externas, mientras que el entorno externo no puede acceder a variables dentro del "contenedor", por lo que las variables definidas dentro (function () {...}) () no entrarán en conflicto con variables externas, comúnmente conocidas como "envoltura anónima" o "espacio de nombres".
JQuery usa este método. Cuando el código jQuery está envuelto en (función (ventana, indefinido) {... código jQuery ...} (ventana), puede proteger las variables internas de jQuery al llamar al código jQuery en el alcance global.
Este artículo es una comprensión y compilación personal. Si hay algún error, apuntarlos. Las opiniones en el artículo se hacen referencia desde:
"Guía autorizada para JavaScript" y "Programación avanzada"