todas hacen aproximadamente lo mismo, con algunas diferencias sutiles:
hay una distinción entre el nombre de la función y la variable a la que se asigna la función. El nombre de la función no se puede cambiar, mientras que la variable a la que se asigna la función se puede reasignar. El nombre de la función solo se puede usar dentro del cuerpo de la función. Intentar usarlo fuera del cuerpo de la función resulta en un error (o undefined
si el nombre de la función fue declarado previamente a través de una instrucción var
)., Por ejemplo:
var y = function x() {};alert(x); // throws an error
El nombre de la función también aparece cuando la función se serializa a través del método toString de Function
.
por otro lado, la variable a la que se asigna la función está limitada solo por su ámbito, que se garantiza que incluye el ámbito en el que se declara la función.
como muestra el ejemplo 4, El nombre de la función puede ser diferente de la variable a la que se asigna la función. No tienen ninguna relación entre ellos. Una declaración de función también crea una variable con el mismo nombre que el nombre de la función., Por lo tanto, a diferencia de las definidas por expresiones de función, se puede acceder a las funciones definidas por declaraciones de función por su nombre en el ámbito en el que se definieron:
una función definida por ‘new Function'
no tiene un nombre de función. Sin embargo, en el motor JavaScript de SpiderMonkey, la forma serializada de la función se muestra como si tuviera el nombre «anónimo». Por ejemplo, alert(new Function())
salidas:
function anonymous() {}
dado que la función en realidad no tiene un nombre, anonymous
no es una variable a la que se pueda acceder dentro de la función., Por ejemplo, lo siguiente daría lugar a un error:
var foo = new Function("alert(anonymous);");foo();
a diferencia de las funciones definidas por expresiones de función o por el constructor Function
, una función definida por una declaración de función se puede usar antes de la declaración de función en sí. Por ejemplo:
foo(); // alerts FOO!function foo() { alert('FOO!');}
Una función definida por una expresión de función o por una declaración de función hereda el ámbito actual. Es decir, la función forma un cierre., Por otro lado, una función definida por un constructor Function
no hereda ningún ámbito que no sea el ámbito global (que heredan todas las funciones).
Las funciones definidas por expresiones de función y declaraciones de función se analizan solo una vez, mientras que las definidas por el constructor Function
no lo son. Es decir, la cadena del cuerpo de la función pasada al constructor Function
debe analizarse cada vez que se llame al constructor., Aunque una expresión de función crea un cierre cada vez, el cuerpo de la función no se repara, por lo que las expresiones de función siguen siendo más rápidas que «new Function(...)
«. Por lo tanto, el constructor Function
generalmente debe evitarse siempre que sea posible.
debe tenerse en cuenta, sin embargo, que las expresiones de función y las declaraciones de función anidadas dentro de la función generada al analizar una cadena de Function constructor
no se analizan repetidamente. Por ejemplo:
una declaración de función se convierte muy fácilmente (y a menudo sin querer) en una expresión de función., Una declaración de función deja de ser una cuando:
- Se convierte en parte de una expresión
- ya no es un «elemento fuente» de una función o del propio script. Un» elemento source » es una instrucción no anidada en el script o un cuerpo de función: