$(document).ready(function(){
    console.log('a');
});

window.fbAsyncInit = function() {
    FB.init({appId: '{/literal}{$fbAppId}{literal}',
            status: true,
            cookie: true,
            xfbml: true});

    FB.Event.subscribe('edge.create', function(response) {
        // Do something, e.g. track the click on the "Like" button here
        if(!liked)
        {
            {/literal}$.get('http://{$rooturl}/promotions/likecheck.php?CID={$CID}&ctype={$campaignTable}');{literal}
            liked=true;
        }
    });
};
(function() {
    console.log('b');
    var e = document.createElement('script');
    e.type = 'text/javascript';
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
    e.async = true;
    document.getElementById('fb-root').appendChild(e);
}());

Me doy cuenta de que cuando ejecuto este javascript en mi consola obtengo el resultado:

b
a

Me pregunto qué significa envolver una función entre paréntesis en JavaScript, como aquí:

    (function() {
    console.log('b');
    var e = document.createElement('script');
    e.type = 'text/javascript';
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
    e.async = true;
    document.getElementById('fb-root').appendChild(e);
}());

¿La intención de hacer esto es hacer que esta función se ejecute por primera vez en una etiqueta de script?

2
Casey Flynn 26 may. 2011 a las 18:07

3 respuestas

La mejor respuesta

Esto a veces se denomina como una "función de auto invocación", aunque esa terminología puede ser engañosa. Como se indicó, es una forma de crear una función anónima, no guardar la referencia en ningún lugar y luego invocarla de inmediato.

La función nunca se ejecutará nuevamente. Puede cuestionar la utilidad de esto, pero en realidad es un buena práctica para indicar que este es el código de programa real, separado de la función u otras definiciones de objeto.

Sin embargo, aún debe usar la palabra clave var para asegúrese de no contaminar el mundo espacio de nombres.

Un ejemplo:

var outside = "Hello Outside";
(function()
{
  alert(outside); // Works as expected.

  // Define some variable and see what happens.
  globalVar = "Hello World, redux";
  var localVar = "Hello World";
}());

alert(globalVar);
alert(localVar); // Get an error: "localVar is not defined"
1
Peter 26 may. 2011 a las 14:40

El propósito de hacerlo es simplemente crear un ámbito léxico privado para que las variables declaradas para su uso por ese tramo de código no contaminen el espacio de nombres global. no obliga al código a ejecutarse "primero".

Entonces, por ejemplo, esa variable "e" desaparecerá después de que se ejecute la función, y no habrá "e" flotando para molestar a ningún otro código.

1
Pointy 26 may. 2011 a las 14:09

Esta es una forma de crear una función (con su propio cierre y variables) e invocarla de inmediato, pero sin contaminar el espacio de nombres global.

1
Alnitak 26 may. 2011 a las 14:10