来自:http://developers.facebook.com/docs/guides/web/
(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#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
2个问题:
答案 0 :(得分:2)
该函数是自调用的,以便不对全局命名空间进行轮询。它本来可以写成如下:
function loadScript(d, s, id){
//...
}
loadScript(document, 'script', 'facebook-jssdk');
但是你有一个名为loadScript的对象在全局范围级别浮动,这会与任何其他也有一个名为loadScript的变量或函数的库发生冲突。
它是异步的,因为它动态地将一个脚本元素插入到DOM中,这是一个异步操作。请查看本文以进行更深入的讨论,http://friendlybit.com/js/lazy-loading-asyncronous-javascript/
此外,这不是一个闭包,因为函数内部没有函数。闭包是一种维持其环境状态的函数。无论如何,这一区别对于这个问题并不是非常重要。