Existen dos métodos principales para crear funciones en JavaScript: declaraciones de funciones y expresiones de funciones. Ambos métodos tienen diferentes escenarios aplicables. Esta nota se centra principalmente en varias características importantes de las expresiones de funciones y sus escenarios de uso, que se describen a continuación.
Características principales
• Nombre de función opcional
El nombre de la función es una parte necesaria de la declaración de función. Este nombre de función es equivalente a una variable. La función recién definida se copiará a esta variable. La llamada a la función debe realizarse a través de esta variable en el futuro. Para expresiones de funciones, el nombre de la función es opcional, por ejemplo:
var sub = function (a1, a2) {return a1-a2; }En este ejemplo, la expresión de la función no tiene nombre y pertenece a la expresión de la función anónima. Echemos un vistazo al siguiente ejemplo:
var sub = function f (a1, a2) {return a1-a2; } console.log (f (5,3)); // Método de llamada incorrecto console.log (sub (5,3)); // método de llamada correctoEn este ejemplo, el nombre de la expresión de la función es f. Este nombre F en realidad se convierte en una variable local dentro de la función y se refiere al objeto de la función en sí. Es de gran uso cuando la función recursiva, y se discutirá en detalle más adelante.
• Crear durante la fase de ejecución (diferente de las declaraciones de funciones)
Esta característica es que la expresión de la función es obviamente diferente de la declaración de función.
El intérprete no trata ambos métodos por igual al analizar el código JavaScript. El intérprete leerá primero la declaración de función y la pondrá a disposición antes de ejecutar cualquier código; Mientras que para las expresiones de funciones, debe esperar hasta que el intérprete se ejecute a la línea de código donde se encuentra antes de que realmente se analice y ejecute. Por ejemplo:
console.log (agregar (1,2)); // "3" console.log (sub (5,3)); // "Identificador inesperado", función de error add (a1, a2) {return a1+a2; } var sub = function (a1, a2) {return a1-a2; }La primera declaración se puede ejecutar normalmente. Al evaluar el código, el motor JavaScript declara funciones en el primer pase y las coloca en la parte superior del árbol de origen a través de un proceso llamado promoción de la declaración de función. Es decir, durante la etapa de creación del entorno de ejecución (la función se llama pero no ha comenzado la ejecución), la declaración de la función será "alojamiento". Entonces, incluso si el código que declara una función está detrás del código que lo llama, el motor JavaScript elevará la declaración de función a la parte superior. Sin embargo, si la declaración de función se cambia a una expresión de función, se informará un error durante la ejecución. La razón es que antes de ejecutar la declaración donde se encuentra la función, el submarino variable no contiene una referencia a la función. Es decir, el submarino variable se asignará durante la etapa de ejecución del código. Excepto por las diferencias anteriores, en otros aspectos, la sintaxis de las declaraciones de función y las expresiones de funciones es equivalente.
• No afecte los objetos variables
var sub = function f (a1, a2) {console.log (typeof f); // "Función" return A1-A2; } console.log (typeof f); // "referenceError de reference: f no está definido (...)"En el ejemplo anterior, podemos ver que el nombre de la función F solo se puede usar dentro del objeto de función, y el nombre de la función de la expresión de la función no existe en el objeto variable.
Use escenarios
Hay muchos escenarios de uso para expresiones de funciones. A continuación se describe principalmente las aplicaciones de la recursión de funciones y la modularidad del código.
• Recursión de funciones
Vea el siguiente ejemplo:
función factorial (num) {if (num <= 1) {return 1; } else {return num * factorial (num - 1); }}Esta es una función factorial clásica, pero un problema con este ejemplo es que el nombre de la función factorial está estrechamente acoplado al cuerpo de la función. Si ejecuta la siguiente declaración, recibirá un error:
var otro factorial = factorial; factorial = nulo; console.log (otro factorial (5)); // "TypeError type no ha sido una función"
La razón de un error es que la función factorial se llamará dentro del cuerpo de la función, y la referencia a la función por el factorial variable se ha cancelado, por lo que se informa un error. La solución a esta situación generalmente se puede resolver usando argumentos. Callee, que siempre apunta a la función actual, por ejemplo:
función factorial (num) {if (num <= 1) {return 1; } else {return num * arguments.callee (num - 1); }}De esta manera, puede obtener el resultado correcto ejecutando otra función de Factorial aquí. Sin embargo, en modo estricto "estricto", no se puede acceder a los argumentos.callee a través de scripts. Así es como resolver este problema usando expresiones de funciones, por ejemplo:
var factorial = (función f (num) {if (num <= 1) {return 1;} else {return num * f (num - 1);}}); console.log (factorial (5)); // "120"• Modularidad del código
No hay un alcance de nivel de bloque en JavaScript, pero podemos usar expresiones de funciones para modularizar el código JavaScript. El código modular puede encapsular detalles que no necesitan ser conocidos por el usuario, y solo exponerlos a las interfaces relevantes del usuario, al tiempo que evita la contaminación al entorno global, como:
var persona = (function () {var _name = ""; return {getName: function () {return _name;}, setname: function (newName) {_name = newName;}};} ()); persona.setName ("John"); persona.getName (); //"John"En este ejemplo, se crea una expresión de función anónima, que contiene las variables y funciones privadas del módulo; El resultado de la ejecución de esta expresión de función devuelve un objeto, que contiene la interfaz pública expuesta por el módulo al usuario. Hay muchas formas específicas de modularidad del código. Por ejemplo, en algunas bibliotecas JavaScript de uso común, generalmente se usan funciones de ejecución inmediatas similares a los siguientes ejemplos:
(function () {var _name = ""; var root = this; var persona = {getName: function () {return _name;}, setname: function (newname) {_name = niewName;}}; root.person = persona;} .call (this)); persona.setName ("John"); persona.getName (); //"John"Este método utiliza directamente el objeto que contiene la interfaz pública del módulo como un atributo del objeto global, de modo que el atributo del objeto global se pueda usar en otro lugar.
Las expresiones de la función JavaScript de cliché anterior son todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.