0

来自: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个问题:

  1. 为什么用于在自调用闭包中加载 FB SDK 的代码?
  2. 代码的哪一部分实际上使 SDK 异步加载?
4

1 回答 1

2

该函数是自调用的,以免污染全局命名空间。它可以很容易地写成如下:

function loadScript(d, s, id){
    //...
}
loadScript(document, 'script', 'facebook-jssdk');

但是你有一个名为 loadScript 的对象在全局范围级别上浮动,这将与任何其他也有一个名为 loadScript 的变量或函数的库发生冲突。

它是异步的,因为它动态地将脚本元素插入到 DOM 中,这是一个异步操作。看看这篇文章进行更深入的讨论, http: //friendlybit.com/js/lazy-loading-asyncronous-javascript/

此外,这不是闭包,因为函数内部没有函数。闭包是一个维护其环境状态的函数。无论如何,这种区别对于这个问题并不重要。

于 2012-05-03T21:40:17.277 回答