sencillos resueltos ejercicios ejemplos completo comandos avanzado javascript function syntax parentheses iife

resueltos - manual javascript avanzado pdf



JavaScript avanzado: ¿por qué esta función está entre paréntesis? (4)

Hay algunas cosas pasando aquí. Primero es el patrón de expresión de función invocada inmediatamente (IIFE):

(function() { // Some code })();

Esto proporciona una forma de ejecutar código JavaScript en su propio ámbito. Usualmente se usa para que las variables creadas dentro de la función no afecten el alcance global. Puede usar esto en su lugar:

function foo() { // Some code } foo();

Pero esto requiere darle un nombre a la función, que no siempre es necesario. El uso de una función nombrada también significa que en algún punto futuro la función podría volver a llamarse lo que podría no ser deseable. Al utilizar una función anónima de esta manera, se asegura de que solo se ejecute una vez.

Esta sintaxis no es válida:

function() { // Some code }();

Porque tiene que ajustar la función entre paréntesis para que se pueda analizar como una expresión. Más información está aquí: http://benalman.com/news/2010/11/immediately-invoked-function-expression/

Entonces, para recapitular rápidamente sobre el patrón IIFE:

(function() { // Some code })();

Permite que ''algún código'' se ejecute inmediatamente, como si se acabara de escribir en línea, pero también dentro de su propio alcance para no afectar el espacio de nombres global (y así interferir o interferir potencialmente con otros scripts).

Puede pasar argumentos a su función tal como lo haría con una función normal, por ejemplo,

(function(x) { // Some code })(1);

Así que estamos pasando el valor ''1'' como primer argumento a la función, que lo recibe como una variable de ámbito local, llamada x.

En segundo lugar, tiene las agallas del código de la función en sí:

delete x; return x;

El operador de eliminación eliminará las propiedades de los objetos. No elimina variables. Asi que;

var foo = {''bar'':4, ''baz'':5}; delete foo.bar; console.log(foo);

Resultados en esto siendo registrado:

{''baz'':5}

Mientras,

var foo = 4; delete foo; console.log(foo);

registrará el valor 4, porque foo es una variable, no una propiedad, por lo que no se puede eliminar.

Muchas personas suponen que eliminar puede eliminar variables, debido a la forma en que funcionan los autoglobals. Si asigna una variable sin declararla primero, en realidad no se convertirá en una variable, sino en una propiedad en el objeto global:

bar = 4; // Note the lack of ''var''. Bad practice! Don''t ever do this! delete bar; console.log(bar); // Error - bar is not defined.

Esta vez, la eliminación funciona, porque no está eliminando una variable, sino una propiedad en el objeto global. En efecto, el fragmento anterior es equivalente a esto:

window.bar = 4; delete window.bar; console.log(window.bar);

Y ahora puedes ver cómo es análogo al ejemplo del objeto foo y no al ejemplo de la variable foo.

Posible duplicado:
¿Cuál es la construcción (función () {}) () en JavaScript?

Encontré este código JavaScript, pero no tengo idea de qué hacer. ¿Por qué obtengo "1" cuando ejecuto este código? ¿Qué es este pequeño y extraño apéndice de (1) y por qué la función está entre paréntesis?

(function(x){ delete x; return x; })(1);


La gente normalmente llama a estas "expresiones de función invocadas inmediatamente" o "funciones de autoejecución".

El objetivo de esto es que las variables declaradas dentro de esa función no se filtren al exterior.


La razón por la que aún recibe 1 es que la palabra clave eliminar es para eliminar propiedades de los objetos . El resto es lo que otros han comentado, todo lo que está entre corchetes se ejecuta como una función, y el segundo conjunto de corchetes son los argumentos pasados ​​a ese bloque.

Aquí está la referencia de MDN para eliminar , y la referencia de MDN para cierres , que también analiza las funciones anónimas.


Significa que creó una función anónima y la llama con el parámetro 1 .

Es lo mismo que:

function foo(x) { delete x; return x; } foo(1);