invoked immediately funciones funcion expressions closure autoejecutables anonima javascript iife

javascript - immediately - ¿Por qué usar el operador NO en una llamada de función anónima?(a la Knockout 2.1.0)



immediately invoked function expressions javascript (2)

Posible duplicado:
¿Qué hace el signo de exclamación antes de la función?

Si observa el código fuente de KnockoutJS 2.1.0 verá una estructura de código como esta que comienza en la línea 7:

!function(factory) { ... }(factoryDefinition);

El operador no hace que esta expresión se evalúe como true lugar de undefined , pero ¿por qué molestarse?


Esta es una forma concisa de formar una expresión de función ejecutada inmediatamente.

Tradicionalmente, las personas han usado estas dos formas.

(function(){ }()); // Recommended by Crockford (function(){ })(); // What most people use

Si intentas simplemente usar

function(){ }(); // Syntax error

será un error de sintaxis, porque se interpreta como una declaración de función en lugar de una expresión. Esta es la razón por la que necesitarías envolver la función entre paréntesis.

Pero si coloca un operador unario antes de la declaración de la función, no tiene que agregar un paréntesis de cálculo de costos, y se corta un carácter del código, lo que es un (muy) pequeño beneficio de rendimiento. Hay varios operadores unarios que pueden ser utilizados para este mismo propósito.

!function(){ }(); ~function(){ }(); -function(){ }(); +function(){ }();


Porque si no haces algo, entonces parece un error de sintaxis:

function(factory) { ... }(factoryDefinition);

Intentalo.

Es necesario llevar el analizador a un punto en el que se espera una expresión, para que la palabra clave de function se reconozca en ese contexto. De lo contrario, cuando el analizador ve la function como el primer token en una declaración, espera una declaración de función simple, y eso no puede ser seguido por una lista de argumentos entre paréntesis.

Hay varias alternativas, alrededor de cada una de las cuales se agrupan varias opiniones.