資源描述:
《javascript作用域示例詳解_javascript技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、JavaScript作用域示例詳解作用域是JavaScript最重要的概念Z_,想要學(xué)好JavaScript就需要理解JavaScript作用域和作用域鏈的工作原理。今天這篇文章對(duì)JavaScript作用域示例詳解的介紹,希望能幫助大家更好的學(xué)習(xí)JavaScript。任何程序設(shè)計(jì)語(yǔ)言都有作用域的概念,簡(jiǎn)單的說(shuō),作用域就是變量與函數(shù)的可訪問(wèn)范圍,即作用域控制著變量與函數(shù)的可見(jiàn)性和生命周期。在JavaScript屮,變量的作用域有全局作用域和局部作用域兩種。一、JavaScript中無(wú)塊級(jí)作用域在Java或C#中存在塊級(jí)作用域,即:大括號(hào)也是一個(gè)作用域。publicstaticvoidm
2、ain(){if仃二二1){Stringname二〃seven〃;}System?out?println(name);}//報(bào)錯(cuò)publicstaticvoidMain(){if(l==l){?〃〃stringname=seven;}Console.WriteLine(name);}//報(bào)錯(cuò)在JavaScript語(yǔ)言中無(wú)塊級(jí)作用域functionMain(){if(1=1){varname='seven';}console?log(name);}//輸出:seven二、JavaScript釆用函數(shù)作用域在JavaScript屮每個(gè)函數(shù)作為一個(gè)作用域,在外部無(wú)法訪問(wèn)內(nèi)部作用威屮的變量。
3、fundionMain(){varinnerValue='seven';}MainO;console.log(innerValue);//扌艮錯(cuò):UncaughtReferenceError:innerValueisnotdefined三、JavaScript的作用域鏈由于JavaScript中的每個(gè)函數(shù)作為一個(gè)作用域,如果出現(xiàn)函數(shù)歐套函數(shù),則就會(huì)岀現(xiàn)作用威鏈。xo二'alex,;functionFunc(){varxo="seven";functioninner(){varxo二'alvin,;console?1og(xo);}inner();}Func();如上述代碼則出現(xiàn)三個(gè)作
4、用域組成的作用域鏈,如果出現(xiàn)作用域鏈后,那么尋找變量時(shí)候就會(huì)出現(xiàn)順序,對(duì)于上述實(shí)例:當(dāng)執(zhí)行console,log(xo)時(shí),其尋找順序?yàn)楦鶕?jù)作用域鏈從內(nèi)到外的優(yōu)先級(jí)尋找,如果內(nèi)層沒(méi)冇就逐步向上找,直到?jīng)]找到拋出異常。四、JavaScript的作用域鏈執(zhí)行前已創(chuàng)建JavaScript的作用域在被執(zhí)行之前已經(jīng)創(chuàng)建,日后再去執(zhí)行吋只需要按照作用域鏈去尋找即可。示例一:xo二'alex,;functionFunc(){varxo=sevenfunctioninner(){console,log(xo);returninner;}varret=Func();ret();//輸出結(jié)果:seven
5、上述代碼,在函數(shù)被調(diào)用之前作用域鏈已經(jīng)存在:?全局作用域->Func函數(shù)作用域->inner函數(shù)作用域當(dāng)執(zhí)行【mt();】時(shí),由于其代指的是inner函數(shù),此函數(shù)的作用域鏈在執(zhí)行Z前已經(jīng)被定義為:全局作用域->Func函數(shù)作用域->inner函數(shù)作用域,所以,在執(zhí)行【ret();】時(shí),會(huì)根據(jù)已經(jīng)存在的作用域鏈去尋找變量。示例二:xo='alcx';functionFunc(){〃?〃varxo=eirc;functioninner(){console,log(xo);}xo='seven';returninner;}varret二Func();ret();//輸出結(jié)果:seven上述
6、代碼和示例一的目的相同,也是強(qiáng)調(diào)在函數(shù)被調(diào)用之前作用域鏈已經(jīng)存在:?全局作用域-〉Func函數(shù)作用域-〉inner函數(shù)作用域不同的時(shí),在執(zhí)行【varret二FuncO;]時(shí),F(xiàn)unc作用域中的xo變量的值已經(jīng)由“sic”被重置為“seven”,所以Z后再執(zhí)行【ret0;】時(shí),就只能找到“seven”。不例三:xo='alex';
functionBar(){console,log(xo);}functionFunc(){〃〃varxo二seven;returnBar;}varret=Func();ret();//輸出結(jié)果:alex上述代碼,在函數(shù)被執(zhí)行Z前已經(jīng)創(chuàng)建了兩條作用域鏈
7、:?全局作用域-〉Bar函數(shù)作用域?全局作用域->Func函數(shù)作用域當(dāng)執(zhí)行【ret();】時(shí),rel代指的Bar函數(shù),而B(niǎo)ar函數(shù)的作用域鏈已經(jīng)存在:全局作用域->Bar函數(shù)作用域,所以,執(zhí)行時(shí)會(huì)根據(jù)已經(jīng)存在的作用域鏈去尋找。五、聲明提前在JavaScript中如果不創(chuàng)建變量,直接去使用,則報(bào)錯(cuò):console,log(xxoo);//扌良錯(cuò):UncaughtReferenccError:xxooisnotdefinedJavaScript中如果創(chuàng)建值而不