为什么自我调用关闭加载Javascript FB SDK?

时间:2012-05-03 21:26:03

标签: closures facebook-javascript-sdk

来自: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异步加载?

1 个答案:

答案 0 :(得分:2)

该函数是自调用的,以便不对全局命名空间进行轮询。它本来可以写成如下:

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

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

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

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