Javascript 异步.js文件加载语法
我注意到异步加载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='
(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)异步加载脚本的脚本的未来证明。谢谢