1.一個(gè)功能抽象為一個(gè)函數(shù),單獨(dú)提取出來(lái),達(dá)到復(fù)用的目的绳姨。
2.遞歸颇玷,先執(zhí)行的最后執(zhí)行完。
3.定義在全局的叫全局變量就缆,定義在函數(shù)里面的叫局部變量帖渠,函數(shù)里面的可以訪問(wèn)外面的,函數(shù)外面的不能訪問(wèn)函數(shù)外面的竭宰,越在函數(shù)里面的權(quán)限越高空郊。
4.、預(yù)編譯
? ? 1)js三部曲:語(yǔ)法分析切揭、預(yù)編譯狞甚、解釋執(zhí)行
? ? ? ? 語(yǔ)法分析:先通篇掃描,看有沒(méi)有語(yǔ)法錯(cuò)誤等
? ? ? ? 預(yù)編譯:看下面詳解廓旬。是解釋執(zhí)行的前奏哼审。
? ? ? ? 解釋執(zhí)行:解釋一行執(zhí)行一行。
? ? 2)預(yù)編譯
? ? ? ? 本知識(shí)點(diǎn)要先知道什么叫函數(shù)聲明孕豹、什么叫變量聲明涩盾。
? ? ? ? 1.函數(shù)聲明整體提升,所以當(dāng)你聲明一個(gè)函數(shù)以后励背,系統(tǒng)在執(zhí)行的時(shí)候春霍,會(huì)首先把函數(shù)聲明提到最前面這一步就是函數(shù)聲明提升,所以不論是在函數(shù)上面執(zhí)行函數(shù)還是在函數(shù)下面執(zhí)行函數(shù)叶眉,其本質(zhì)都是在函數(shù)下面執(zhí)行函數(shù)址儒。
? ? ? 2. 變量? ? 聲明提升,就是當(dāng)你定義一個(gè)變量以后衅疙,系統(tǒng)在執(zhí)行時(shí)莲趣,會(huì)先將變量聲明提到最前面。
注:淺顯的記憶方式按上面兩句來(lái)記憶饱溢。
重點(diǎn)按預(yù)編譯來(lái)喧伞。
(1)imply global? 暗示全局變量:即任何變量,如果未經(jīng)聲明就賦值理朋,此變量就為全局所有絮识。
eg:a = 123;
eg: function test(){
? ? ? ? var a = b =2;
? ? ? }
? ? ? test();
? ? ? window.b --2
? ? ? window.a --undefined
(2)全局對(duì)象就是window,window是一個(gè)對(duì)象嗽上,window對(duì)象可以上添加屬性,所以:
? ? a = 10; --> window.a = 10;
? ? 一切聲明的全局變量,全是window的屬性熄攘。即window就是全局的域兽愤。
? ? var a = 123; -->window:{ a : 123 }? -->window.a = 123;
預(yù)編譯四部曲
預(yù)編譯發(fā)生在函數(shù)執(zhí)行的前一刻
1.創(chuàng)建一個(gè)AO 對(duì)象? ? Activation Object
2.找形參和變量聲明,將變量和形參名作為AO屬性名,值為undefined
3.將實(shí)參值和形參統(tǒng)一
4.在函數(shù)體里面找函數(shù)聲明浅萧,值賦予函數(shù)體
function? fn(a){
????????console.log(a);? //function a(){}
? ? ? ? var a = 123;
????????console.log(a);? // 123
? ? ? ? function a(){}
????????console.log(a);? //123
? ? ? ? var b = function(){}
????????console.log(b);? //function(){}
? ? ? ? function d(){}
}
預(yù)編譯在函數(shù)執(zhí)行前一刻:
函數(shù)存儲(chǔ)空間庫(kù)
AO : {
? ? a : undefined,-->1-->function a(){}
? ? b : undefined,
? ? d : function d(){}
}
fn(1);
執(zhí)行時(shí):1.console.log(a),就直接在AO里面找a逐沙,就是function a(){}
? ? ? ? ? ? ? ? 2.var a = 123;因?yàn)閯?chuàng)建AO時(shí)已經(jīng)進(jìn)行了變量提升var = a ;所以這一步只需要進(jìn)行變量賦值a = 123;
? ? ? ? ? ? ? ? 3.console.log(a)-->123
? ? ? ? ? ? ? ? 4.function a(){},這一步已經(jīng)在創(chuàng)建AO的時(shí)候進(jìn)行函數(shù)聲明提升,所以直接執(zhí)行下一步洼畅。
? ? ? ? ? ? ? ? 5.console.log(a)-->123
? ? ? ? ? ? ? ? 6.var b = function(){},創(chuàng)建AO對(duì)象時(shí)var b,已經(jīng)執(zhí)行,所以這里直接賦值
? ? ? ? ? ? ? ? 7.console.log(b)-->function(){}
全局的預(yù)編譯
在函數(shù)里面的預(yù)編譯吩案,生成AO對(duì)象,在全局的預(yù)編譯生成GO對(duì)象帝簇,即Global? Object
window===GO
1.生成GO對(duì)象
2.查找所有的變量聲明徘郭,將變量名作為GO對(duì)象的屬性名,值為undefined
3.查找所有的函數(shù)聲明丧肴,將函數(shù)本身賦給函數(shù)
var a = 123;
function a(){}
GO:{
? ? a:undefined残揉,---->function a(){}
}
執(zhí)行時(shí):? a = 123;
注意:因?yàn)镚O是全局的對(duì)象,AO是函數(shù)執(zhí)行前一刻生成的對(duì)象芋浮,所以一定是先生成GO再生成AO抱环。
注意:新改的規(guī)定,不允許在if語(yǔ)句里面聲明函數(shù)纸巷。
1)var str = fales + 1;--->0 + 1----->1
2)if(typeof(a) && -true + (+undefined) + ""){? alrte('說(shuō)出你的答案U虿荨!瘤旨!')}
typeof(a)-->"undefined"
-true--> -1
+undefined-->NaN
相當(dāng)于if( "undefined" && "NaN"){ 所以可以彈出alrte框 }
3)!!" " + !!"" - !!fales || consloe.log("打印啥陶夜?")
? ? true? + fales - fales || console.log("...")
? ? 1 + 0 - 0 --->1 || console.log('...') 所以看見(jiàn)1就停止運(yùn)行,不執(zhí)行后面的console
4)(window.foo || (window.foo = ‘bar’))
本題()優(yōu)先級(jí)最高裆站,所以先看(window.foo = 'bar')
如果(window.foo || window.foo = ‘bar’)會(huì)報(bào)錯(cuò)条辟,因?yàn)?優(yōu)先級(jí)最低