问题描述
|
$(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);
}());
这样做的目的是使此功能在script标签中首次执行吗?
解决方法
尽管该术语可能会引起误解,但有时将其称为“自调用函数”。如前所述,这是创建匿名函数的一种方法,它不将引用保存到任何地方,然后立即调用它。
该功能将不再执行。您可能会怀疑这样做的用处,但实际上,这是一个好习惯,它是与功能或其他对象定义分开的实际代码。
但是,您仍然必须使用
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\"
,这样做的目的仅仅是创建一个专用词法作用域,以使声明供该段代码使用的变量不会污染全局名称空间。它不会强制代码先执行。
因此,例如,变量“ e”将在函数执行后消失,并且不会再出现“ e”会打扰任何其他代码的情况。
,这是创建函数(具有自己的闭包和变量)并立即调用它的一种方法,但又不会污染全局名称空间。