Javascript 异步.js文件加载语法

Javascript 异步.js文件加载语法,javascript,asynchronous,Javascript,Asynchronous,我注意到异步加载js文件似乎有两种稍微不同的语法,我想知道这两种语法之间是否有区别,或者它们的功能是否基本相同。我猜它们的工作原理是一样的,但只是想确保一种方法不会因为某种原因而优于另一种方法 方法一 (function() { var d=document, h=d.getElementsByTagName('head')[0], s=d.createElement('script'); s.type='text/javascript'; s.src='

我注意到异步加载js文件似乎有两种稍微不同的语法,我想知道这两种语法之间是否有区别,或者它们的功能是否基本相同。我猜它们的工作原理是一样的,但只是想确保一种方法不会因为某种原因而优于另一种方法

方法一

(function() {
    var d=document,
    h=d.getElementsByTagName('head')[0],
    s=d.createElement('script');
    s.type='text/javascript';
    s.src='/js/myfile.js';
    h.appendChild(s);
})(); /* note ending parenthesis and curly brace */
(function() {
    var d=document,
    h=d.getElementsByTagName('head')[0],
    s=d.createElement('script');
    s.type='text/javascript';
    s.async=true;
    s.src='/js/myfile.js';
    h.appendChild(s);
}()); /* note ending parenthesis and curly brace */

方法二(见Facebook代码)


我注意到的唯一区别是
s.async=true

async
defer
属性是指示脚本应如何执行的布尔属性

使用这些属性可以选择三种可能的模式如果存在
async
属性,则脚本将在可用时立即异步执行。
如果不存在
async
属性,但存在defer属性,则在页面完成解析后执行脚本。如果两个属性都不存在,则在用户代理继续解析页面之前,将立即获取并执行脚本

资料来源和进一步阅读:

至于好处,你可能想看看谷歌在去年12月发表的言论:


我对此进行了研究,并为此创建了一个库,其中包括在脚本最终加载时启动回调的支持

Sigma.async_script_load('http://example.com/underscore-min.js', '_', function() {
  _([1,2,3,2,3,1]).uniq();
});

太好了,谢谢。但是,在这种情况下,s.asynch=true不是毫无意义吗,因为脚本被注入了head标记中?至于括号上的语法:(function(){…})();vs:(函数(){…}());-这些都差不多吗?@taber:是的,括号语法达到了同样的目的。ie:函数作为函数表达式而不是函数语句进行计算。请参阅:和(特别是最后一条评论)。@taber:我认为它被插入
中这一事实没有任何区别。(但我没有支持这一点的参考或测试)。括号也没关系。它们是一样的。jslint更喜欢
function(){}())
感谢您添加GA链接。是的,看起来“async”只是“正式”告诉浏览器(现在是Firefox 3.6)异步加载脚本的脚本的未来证明。谢谢