Javascript事件语法问题

时间:2011-05-26 14:07:40

标签: javascript jquery events syntax

$(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 个答案:

答案 0 :(得分:1)

这样做的目的仅仅是创建一个私有词法范围,以便声明由该段代码使用的变量不会污染全局命名空间。它确实强制代码“先”执行。

因此,例如,变量“e”将在函数执行后消失,并且没有“e”浮动以打扰任何其他代码。

答案 1 :(得分:1)

这是一种创建函数(具有自己的闭包和变量)并立即调用它的方法,但不会污染全局命名空间。

答案 2 :(得分:1)

这有时被称为“自我调用函数”,尽管该术语可能会产生误导。如上所述,这是一种创建匿名函数的方法,不是将引用保存在任何地方,然后立即调用它。

该功能永远不会再次执行。您可能会质疑这一点的用处,但它实际上是一个good practice来表示这是实际的程序代码,与函数或其他对象定义分开。

但是,您仍然必须使用var关键字ensure you don't pollute the global namespace

一个例子:

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"