全局范围内的JavaScript语句

全局范围内的JavaScript语句,javascript,jquery,facebook-javascript-sdk,Javascript,Jquery,Facebook Javascript Sdk,我在.js文件中写了一个if语句,在任何函数之外,这意味着它在全局范围内,对吗 以下是代码片段:- if ((window != window.parent) && (document.referrer.indexOf("facebook") != -1)) { window.fbAsyncInit = function() { FB.init({ appId : '...', status

我在.js文件中写了一个if语句,在任何函数之外,这意味着它在全局范围内,对吗

以下是代码片段:-

if ((window != window.parent) && (document.referrer.indexOf("facebook") != -1)) {
    window.fbAsyncInit = function() {
        FB.init({
            appId      : '...',
            status     : true,
            xfbml      : true
        });
    };

    (function(d, s, id){
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) {return;}
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/en_US/all.js";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));
}
以以下方式书写此声明是否更好:-

(function() {
    if ...
})(); 

这样做的好处是什么?这些类型的函数被称为什么?

它们被称为立即执行函数(IEF)。你经常会听到它们被称为自执行函数,但这有点用词不当;他们不是自己执行的,他们是由你执行的,而是立即执行的

这样做的好处是保护全球范围免受污染。比如说,这可以防止库和插件之间的冲突,对于严格模式(strict mode)也很有用,严格模式的一部分原理是所有内容都包含在某种类型的闭包中


我不会有很多IEF;考虑一个完整的脚本。或者,您可以通过使用类似于对象模式的东西来实现全局闭包。

“类似于对象模式的东西”。您能解释一下吗?您的所有代码都位于作为对象静态方法的模块中。