淺談javascript中的作用域
表示變量或函數(shù)起作用的區(qū)域,指代了它們?cè)谑裁礃拥纳舷挛闹袌?zhí)行,亦即上下文執(zhí)行環(huán)境。Javascript的作用域只有兩種:全局作用域和本地作用域,本地作用域是按照函數(shù)來(lái)區(qū)分的。
首先來(lái)看幾道題目:
1.
if(true){
var aa= "bb";
}
console.log(aa); //bb
for(var i = 0; i < 100; i++){
//do
}
console.log(i); //100
2.
var bb = '11111';
function aa() {
alert(bb);//undefine
var bb = 'test';
alert(bb);//test
var cc = "test1";
alert(age);//語(yǔ)法錯(cuò)誤
}
aa();
3.
var test = '1111111';
function aa() {
alert(test);
}
function bb() {
var test = '22222222';
aa();
}
bb();//alert(1111111);
4.
alert(typeof aa); //function
alert(typeof bb); //undefined function aa() { //函數(shù)定義式
alert('I am 111111111');
};
var bb = function() { //函數(shù)表達(dá)式
}
alert(typeof bb);//function
5.
function aa(){
var bb = "test";
cc = "測(cè)試";
alert(bb);
}
aa();
alert(cc);//測(cè)試
alert(bb);//語(yǔ)法報(bào)錯(cuò)
上面這5道題目全部概括了js中作用域的問(wèn)題
可以總結(jié)出這么幾個(gè)觀點(diǎn)
一、無(wú)塊級(jí)作用域
從第一題中可以看出來(lái),在{}中執(zhí)行后,變量并沒(méi)有被銷(xiāo)毀,還是保存在內(nèi)存中的,因此我們可以訪問(wèn)到的。
二、JavaScript中的函數(shù)運(yùn)行在它們被定義的作用域里,而不是它們被執(zhí)行的作用域里.
這里提到函數(shù)的作用域鏈這個(gè)概念,在ECMA262中,是這樣的
任何執(zhí)行上下文時(shí)刻的作用域, 都是由作用域鏈(scope chain)來(lái)實(shí)現(xiàn).
在一個(gè)函數(shù)被定義的時(shí)候, 會(huì)將它定義時(shí)候的scope chain鏈接到這個(gè)函數(shù)對(duì)象的[[scope]]屬性.
在一個(gè)函數(shù)對(duì)象被調(diào)用的時(shí)候,會(huì)創(chuàng)建一個(gè)活動(dòng)對(duì)象(也就是一個(gè)對(duì)象), 然后對(duì)于每一個(gè)函數(shù)的形參,都命名為該活動(dòng)對(duì)象的命名屬性, 然后將這個(gè)活動(dòng)對(duì)象做為此時(shí)的作用域鏈(scope chain)最前端, 并將這個(gè)函數(shù)對(duì)象的[[scope]]加入到scope chain中.
所以題目3 結(jié)果是alert(1111111);
三、JS會(huì)提前處理function定義式 和var關(guān)鍵字
如題目4 開(kāi)始alert(bb); //undefine ,alert(age)//語(yǔ)法報(bào)錯(cuò),這兩個(gè)有什么區(qū)別呢,原因就是后面有var bb =“test”,在初始化的時(shí)候提前處理了var 這個(gè)關(guān)鍵字,只是這個(gè)開(kāi)始未賦值
將代碼修改成這樣的,可以看出來(lái)
var dd = '11111';
function aa() {
alert(bb);//undefine
var bb = 'test';
alert(bb);//test
var cc = "test1";
alert(age);//語(yǔ)法錯(cuò)誤
}
aa();
alert(dd);//11111
alert(cc);//語(yǔ)法報(bào)錯(cuò)
此處alert(bb)沒(méi)有報(bào)語(yǔ)法錯(cuò)誤,alert(age)報(bào)語(yǔ)法錯(cuò)誤。
但是請(qǐng)注意:
<script>
alert(typeof aa); //結(jié)果:undefined
</script>
<script>
function aa() {
alert('yupeng');
}
</script>
這說(shuō)明js預(yù)編譯是以段為單元的。題目4同理
四、函數(shù)級(jí)作用域
函數(shù)里面的定義的變量,在函數(shù)執(zhí)行完后就銷(xiāo)毀了,不占有內(nèi)存區(qū)域了。
所以題目2最后的alert(cc);語(yǔ)法報(bào)錯(cuò),題目5最后到 alert(bb)同理
- JScript中的''var''定義變量的作用域
- 關(guān)于javascript 回調(diào)函數(shù)中變量作用域的討論
- 理解JavaScript變量作用域更輕松
- JavaScript的變量作用域深入理解
- 有關(guān)js的變量作用域和this指針的討論
- javascript中的作用域scope介紹
- js使用函數(shù)綁定技術(shù)改變事件處理程序的作用域
- js變量以及其作用域詳解
- 深入理解JavaScript系列(14) 作用域鏈介紹(Scope Chain)
- JavaScript中的作用域鏈和閉包
- 關(guān)于JS管理作用域的問(wèn)題
- 淺談angularJS 作用域
- JavaScript修改作用域外變量的方法
相關(guān)文章
JS獲取客戶端IP地址、MAC和主機(jī)名的7個(gè)方法匯總
這篇文章主要介紹了JS獲取客戶端IP地址、MAC和主機(jī)名的7個(gè)方法匯總,JS本身是不支持獲取IP地址等信息的,本文通過(guò)其它方法實(shí)現(xiàn),需要的朋友可以參考下2014-07-07JS 實(shí)現(xiàn)點(diǎn)擊a標(biāo)簽的時(shí)候讓其背景更換
點(diǎn)擊a標(biāo)簽的時(shí)候給其換背景的方法有很多,在本文將為大家介紹下js是如何實(shí)現(xiàn)的,感興趣的朋友不要錯(cuò)過(guò)2013-10-10JavaScript?異步函數(shù)?Promisification?處理詳情
這篇文章主要介紹了JavaScript異步函數(shù)Promisification處理詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08javascript結(jié)合CSS實(shí)現(xiàn)蘋(píng)果開(kāi)關(guān)按鈕特效
這篇文章主要介紹了javascript結(jié)合CSS實(shí)現(xiàn)蘋(píng)果開(kāi)關(guān)按鈕特效的方法以及全部代碼,效果非常不錯(cuò),兼容性也很好,有需要的小伙伴自己參考下2015-04-04JavaScript代碼實(shí)現(xiàn)圖片循環(huán)滾動(dòng)效果
這篇文章主要介紹了JavaScript代碼實(shí)現(xiàn)圖片循環(huán)滾動(dòng)效果的相關(guān)資料,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06js實(shí)現(xiàn)的四級(jí)左側(cè)網(wǎng)站分類(lèi)菜單實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)的四級(jí)左側(cè)網(wǎng)站分類(lèi)菜單,實(shí)例分析了javascript操作頁(yè)面元素實(shí)現(xiàn)tab切換的相關(guān)技巧,需要的朋友可以參考下2015-05-05JavaScript實(shí)現(xiàn)合并(歸并)排序算法示例解析
這篇文章主要為大家介紹了JavaScript實(shí)現(xiàn)合并(歸并)排序算法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08用js實(shí)現(xiàn)放大鏡的效果的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇用js實(shí)現(xiàn)放大鏡的效果的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05javascript字符串與數(shù)組轉(zhuǎn)換匯總
本文給大家分享的是Js中字符串轉(zhuǎn)換成數(shù)組,數(shù)組轉(zhuǎn)換成字符串的函數(shù),十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-05-05