a();functiona(){console.log("a")}
先調(diào)用再聲明,在沒有預(yù)編譯的情況下,不能正常輸出,但是有了預(yù)編譯就可以正常輸出,這就是函數(shù)整體提升;
定義一個(gè)變量 var a = "1233" 這個(gè)過程叫做變量的聲明 和 賦值
console.log(a);//undefinedvar a ="1233"
變量 聲明提升,但是賦值未被提升
low點(diǎn)
函數(shù)聲明整體提升,變量 的聲明提升 上面說的這兩個(gè)點(diǎn)不能解釋下面的代碼
console.log(a);var a ="aaaa";functiona(a){var a =5;}
手動(dòng)懵逼why???
真·預(yù)編譯?前奏 暗示全局變量 imply global
1.任何變量未經(jīng)聲明就賦值,這個(gè)變量就為全局對(duì)象(window)所擁有;
----------------------------------------------------------------------------------------------------
2.全局上聲明的任何變量,即使聲明了也歸window 所有;window就是全局的域.
a =1;var b =2;functionddd(){var a = b =12;//賦值是從右向左,,雖然是在函數(shù)局部作用域內(nèi),12先賦值給了b,b并沒聲明所以b是屬于window的,a是局部的,然后b在賦值給 a}ddd()
// }functiontest(a,b){console.log(a);//function a(){};console.log(b);//undefinedvar b =234;console.log(b)//234a =123;console.log(a);//123functiona(){};var a ;b =234;varb=function(){};console.log(a);//123console.log(b);//function(){};}test(1)1.AO:{//過程}2.AO:{a:undefined;b:undefined;}3.AO:{a:1;b:undefined;}4.AO:{a:functiona(){};b:undefined;}
所以第一次輸出的a是 function a(){};b 是undefined
b=234AO:{a:functiona(){};b:234;}下個(gè)b輸出就是234a =123AO:{a:123;b:234;}下個(gè)a輸出就是123
===中間的聲明對(duì)AO對(duì)象不產(chǎn)生影響所以輸出不變
varb=function(){};AO:{a:123;b:function(){};}
GO 對(duì)象 global object 全局的執(zhí)行上下文 === window 其實(shí)差不多
console.log(a)// 輸出的 function a(){}var a =123;functiona(){}
console.log(a)//1231.GO{}2.GO{a:undefined}3.GO{a:functiona(){}}4.GO{a:123}
GO AO 一起的
console.log(test);// 這個(gè) 輸出的是 function test(){},完了之后,就該調(diào)用函數(shù)了functiontest(test){console.log(test);// function test(){} 這個(gè)是自己的testvar test =123;console.log(test);//123functiontest(){}}test(1);var test =123;
理解了預(yù)編譯就很簡(jiǎn)單
【注】局部輸出或者使用一個(gè)變量,或者方法,假如說內(nèi)外部都有,優(yōu)先使用內(nèi)部的(局部的),局部沒有才去全局找
這一點(diǎn)來個(gè)超級(jí)無敵簡(jiǎn)單的例子:
var global =100;functionfn(){console.log(global)// 100;}fn()
很簡(jiǎn)單輸出的 100過程 先來個(gè)全局 GO 對(duì)象 從上到下
GO{global:100,fn:function(){...},}然后執(zhí)行 fn 來個(gè)局部的 AOAO{// 什么都沒有,么有變量和形參聲明,只能去全局GO里面找global 就輸出; 100}
global =100;functionfn(){console.log(global);//undefinedglobal =200;console.log(global);//200var global =300;console.log(global)//300}fn()var global;functiontest(){console.log(b);//undefinedif(a){//a == undefined ==>falsevar b =100;//跳過賦值}console.log(b)undefinedc =234;console.log(c)//234}var a ;test();
a =10;
console.log(c)// GO{// a:undefined;// test:function(){...}// }// AO{// b:undefined, 預(yù)編譯,可以跳過循環(huán),循環(huán)語句里的變量聲明已經(jīng)寫入了內(nèi)存,所以輸出是undefined// 變量c在函數(shù)內(nèi)部沒有聲明,就被全局接受,【參考以上知識(shí)點(diǎn)】//}