JSON
JSON是一種傳輸數(shù)據(jù)的格式(以對象為樣板竿屹,本質(zhì)上就是對象,但用途有區(qū)別灸姊,對象就是本地用的拱燃,json是用來傳輸?shù)模?/p>
JSON.parse(); string->json
JSON.stringify(); json->string
異步加載
-
defer異步加載,但要等到DOM文檔全部解析完才會被執(zhí)行厨钻。只有IE能用扼雏,也可以將代碼寫到內(nèi)部坚嗜。
<script src='' defer='defer'></script>
-
async異步加載,加載完就執(zhí)行诗充,async只能加載外部腳本苍蔬,不能把js寫在script標(biāo)簽里。
<script src='' async='async'></script>
(按需加載)js的加載蝴蜓,不一定要在解析DOM頁面時就下載碟绑,可以在要用到的時候才下載,這時候可以創(chuàng)建script標(biāo)簽茎匠,插入到DOM中去格仲,加載完畢后callback,封裝的方法代碼如下:
function loadScript(url,callback) {
var script = document.createElement('script');
script.type = "text/javascript";
if(script.readState) {
script.onreadystatechange = function() {//兼容IE
if(script.readState == "complete" || script.readyState == "loaded") {
callback();
}
}
}else{
script.onload = function() {
callback()
};
}
script.src = url;
document.head.appendChild(script);
}
對于正常的js文件,js內(nèi)容如下方法寫的話诵冒,
function test(){...}
function demo(){...}
像調(diào)用上面的(按需加載的)異步加載的話凯肋,需要注意callback這個參數(shù),
如果直接寫函數(shù)名的話汽馋,是不行的侮东,因為在解析的時候,解析loadScript函數(shù)的時候豹芯,是不會解析里面的內(nèi)容的悄雅,也就是函數(shù)體,所以瀏覽器不知道你這個參數(shù)指向的是js文件里的函數(shù)铁蹈,而是會看成一個變量宽闲,所以一般像loadScript('tools.js',test);這樣的話會報錯成test is not defined,為了避免這種情況握牧,有以下幾種解決辦法
-
傳入?yún)?shù)時容诬,做一些調(diào)整。
loadScript('tools.js',function(){ test(); });
這樣的話沿腰,第二個參數(shù)變成了一個函數(shù)引用放案,傳入時不會看函數(shù)體里的內(nèi)容,等到執(zhí)行時才解析矫俺,就可以避免test is not defined
-
改變loadScript里的callback的執(zhí)行方法;
function loadScript(url,callback) { var script = document.createElement('script'); script.type = "text/javascript"; if(script.readState) { script.onreadystatechange = function() {//兼容IE if(script.readState == "complete" || script.readyState == "loaded") { eval(callback); } } }else{ script.onload = function() { eval(callback); }; } script.src = url; document.head.appendChild(script); }
傳入的callback以字符串的形式加()掸冤,
loadScript('tools.js','test()');
-
第三種要配合js文件里的內(nèi)容形式,再改變loadScript里的callback的執(zhí)行方法
js文件:
var tools = { test : function(){ console.log('1'); }, demo : function(){} }
function loadScript(url,callback) { var script = document.createElement('script'); script.type = "text/javascript"; if(script.readState) { script.onreadystatechange = function() {//兼容IE if(script.readState == "complete" || script.readyState == "loaded") { tools[callback](); } } }else{ script.onload = function() { tools[callback](); }; } script.src = url; document.head.appendChild(script); }
傳入的callback以字符串的形式厘托,
loadScript('tools.js','test');