$(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);
}());
这样做是为了使这个函数首先在脚本标记中执行吗?
答案 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"