Вопрос о синтаксисе событий Javascript - PullRequest
2 голосов
/ 26 мая 2011
$(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);
}());

Я замечаю, что когда я запускаю этот 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);
}());

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

Ответы [ 3 ]

1 голос
/ 26 мая 2011

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

1 голос
/ 26 мая 2011

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

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

Однако вам все равно придется использоватьключевое слово 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"
1 голос
/ 26 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...