Событие Javascript-синтаксический вопрос

#javascript #jquery #events #syntax

#javascript #jquery #Мероприятия #синтаксис

Вопрос:

 $(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}amp;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);
}());
  

Я замечаю, что когда я запускаю этот javascript в своей консоли, я получаю вывод:

 b
a
  

Мне интересно, что значит заключать функцию в круглые скобки в javascript, например, здесь:

     (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);
}());
  

Предполагается ли это сделать так, чтобы эта функция выполнялась первой в теге script?

Ответ №1:

Это иногда называют «самозапускающейся функцией», хотя эта терминология может вводить в заблуждение. Как уже говорилось, это способ создать анонимную функцию, а не сохранять ссылку где-либо и затем немедленно вызывать ее.

Функция больше никогда не будет выполнена. Вы можете усомниться в полезности этого, но на самом деле хорошей практикой является указывать, что это фактический программный код, отдельно от функций или других определений объектов.

Однако вам все равно придется использовать var ключевое слово, чтобы убедиться, что вы не загрязняете глобальное пространство имен.

Пример:

 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"
  

Ответ №2:

Цель этого — просто создать частную лексическую область видимости, чтобы переменные, объявленные для использования этим фрагментом кода, не загрязняли глобальное пространство имен. Это не заставляет код выполняться «первым».

Так, например, эта переменная «e» исчезнет после выполнения функции, и не будет «e», плавающей вокруг, чтобы беспокоить любой другой код.

Ответ №3:

Это способ создания функции (с ее собственным закрытием и переменными) и немедленного ее вызова, но без загрязнения глобального пространства имен.