He visto el mismo código escrito en ambos sentidos y me pregunto si hay algún compromiso entre ellos.

Método 1:

(function(i) {
    // Do something to i now
}(global_variable))

Método 2:

(function() {
    // Do something to global_variable now
}())

¿Por qué pasaría una variable global a una función si va a existir en ese ámbito de todos modos?

3
CamJohnson26 17 feb. 2017 a las 00:47

3 respuestas

La mejor respuesta

En este caso, da instrucciones claras de que esta función utiliza un alias global y crea un alias más fácil de escribir. Además, hace que el acceso a la variable sea un poco más rápido porque no necesita buscar en todos los ámbitos hasta que lo encuentre en el ámbito global.

En el caso de las funciones regulares, no una vida como en su ejemplo, hace que su función sea más comprobable porque puede burlarse de lo global que se transfiere más fácilmente.

3
Juan Mendes 16 feb. 2017 a las 22:08

Es posible que desee utilizar el primer ejemplo cuando no desee cambiar permanentemente el valor de global_variable, por alguna razón. P.ej. Después de ejecutar este código, la copia local se cambiará pero la variable global no cambiará.

global_variable=true; (function(i){ i=false; return i; }(global_variable));

Sin embargo, este código obviamente altera global_variable:

global_variable=true; (function(){ global_variable=false; }());

Editar: algo tangencialmente, parece que esta variación altera la variable global, pero no lo hace porque al llamar a la función se crea una copia sombra de la variable global. Probablemente debería evitar este patrón, ya que es probable que cree confusión:

g=true; (function(g){ g=false; return g; }(g));
1
david25272 16 feb. 2017 a las 22:48

Para propósitos de alias, por ejemplo:

(function(leeloo){

    //inside here you can use the short term

})(LeeloominaiLekataribaLaminaTchaiEkbatDeSebat)

//this would be similar, it's a matter of preference
(function(){
    var leeloo = LeeloominaiLekataribaLaminaTchaiEkbatDeSebat;

    //...
})()

O para encerrar un valor, como este ejemplo:

(function($){

    //in here, $ preserves the passed/injected value, 
    //even if the global value changes

})(jQuery.noConflict())

De esta manera, incluso podría usar múltiples versiones de jQuery en la misma página.

1
Thomas 16 feb. 2017 a las 22:11