javascript中的作用域和閉包詳解_javascript技巧

javascript中的作用域和閉包詳解_javascript技巧

ID:30777776

大?。?1.75 KB

頁數(shù):4頁

時(shí)間:2019-01-03

javascript中的作用域和閉包詳解_javascript技巧_第1頁
javascript中的作用域和閉包詳解_javascript技巧_第2頁
javascript中的作用域和閉包詳解_javascript技巧_第3頁
javascript中的作用域和閉包詳解_javascript技巧_第4頁
資源描述:

《javascript中的作用域和閉包詳解_javascript技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫

1、javascript中的作用域和閉包詳解一、JavaScript作用域JavaScript變量實(shí)際上只有兩種作用域,全局變量和函數(shù)的內(nèi)部變量。在函數(shù)內(nèi)部任何一個(gè)地方定義的變量(varscope)其作用域都是整個(gè)函數(shù)體。全局變量:指的是window對(duì)象卜?的對(duì)象屬性。作用域劃分:基于上下文,以函數(shù)進(jìn)行劃分的,而不是由塊劃分的。強(qiáng)調(diào)兩點(diǎn):1.在同一作用域屮,JavaScript是允許變量的重復(fù)定義,并且后一個(gè)定義將覆蓋詢一個(gè)定義。2.函數(shù)內(nèi)部如杲不加關(guān)鍵字vh而定義的變量,默認(rèn)為全局變量。varscope二〃

2、global";functiont(){console,log(scope);//"globalscope二"loceil"console.log(scope);//"local"}10;console,log(scope);//"local"varscope二〃global〃;functiont(){console.log(scope);//"undefineel"varscope二〃local"console,log(scope);//"local"}10;console.log(scope);//"

3、global"在變量解析過程中首先查找局部的作用域,然后查找上層作用域。在第一段代碼的函數(shù)當(dāng)中沒有定義變量scope,T是查找上層作用域(全局作用域),進(jìn)而進(jìn)行輸出其值。但是在第二段代碼的函數(shù)內(nèi)定義了變量scope(無論是在consoleZ后述是Z前定義變量,都認(rèn)為在此作用域擁有變量scope),于是不再向上層的作用域進(jìn)行查找,直接輸出scopeo但是不幸的是此時(shí)的局部變量i并沒右賦值,所以輸出的是undefinedo〃所以根據(jù)函數(shù)作用域的意思,口J以將上述第二段代碼重寫如下:varscope二"glob

4、al";functiont(){varscope;console,log(scope);scope二〃local〃consolc.log(scope);}10;由于函數(shù)作用域的特性,局部變量在整個(gè)函數(shù)體始終是rti定義的,我們可以將變量聲明”提前“到函數(shù)體頂部。varb;//第1步functionfun(){b二,zchange〃;}alert(b);//輸出undefined,由于第1步只定義未賦值varb;//第1步functionfun(){b=z,changc";}fun();//調(diào)用上述函數(shù)al

5、ert(b);//輸出change當(dāng)使用var聲明一個(gè)變量時(shí),創(chuàng)建的這個(gè)屬性是不可配置的,也就是說無法通過delete運(yùn)算符刪除。二、作用域?qū)嵗?html>functionbuttonlnit(){for(vari二1;i〈4;i++){varb=document.getElemenlByTd(z,button"+i);b.addEventListener("click",function(){alert("Button〃+i);},

6、false);}}window.onload=butlonIniI;Buttonlid=,,button2,,>Button2id=,zbutton3,z>Button3當(dāng)注冊(cè)事件結(jié)束后,i的值為4,當(dāng)點(diǎn)擊按鈕時(shí),事件函數(shù)即functionO{alertCButton^+i);}這個(gè)匿名函數(shù)中沒有i,根據(jù)作用域鏈

7、,所以到buttonTnit函數(shù)中找,此時(shí)i的值為4,所以彈岀”buttond“。在jsm,閉包主要涉及到j(luò)s的幾個(gè)其他的特性:作用域鏈,垃圾(內(nèi)存)回收機(jī)制,函數(shù)嵌套,等等。1.作用域鏈:簡單來說,作用域鏈就是函數(shù)在定義的時(shí)候創(chuàng)建的,用于尋找使用到的變量的值的一個(gè)索引,而他內(nèi)部的規(guī)則是,把函數(shù)自身的本地變量放在最前面,把自身的父級(jí)函數(shù)中的變量放在其次,把再高一級(jí)函數(shù)中的變量放在更后而,以此類推直至全局對(duì)象為止。當(dāng)函數(shù)小需要查詢一個(gè)變量的值的時(shí)候,js解釋器會(huì)去作用域鏈去查找,從最前面的本地變量屮先找,如

8、果沒有找到對(duì)應(yīng)的變量,則到下一級(jí)的鏈上找,一旦找到了變量,則不再繼續(xù)。如果找到最后也沒找到需耍的變量,則解釋器返回undefinedo2.Javascript的垃圾冋收機(jī)制:在Javascript中,如果一個(gè)對(duì)象不再被引用,那么這個(gè)對(duì)象就會(huì)被GC回收。如果兩個(gè)對(duì)象互相引用,而不再被第3者所引用,那么這兩個(gè)互相引用的對(duì)象也會(huì)被回收。因?yàn)楹瘮?shù)a被b引用,b乂被3外的c引用,這就是為什么函數(shù)a執(zhí)行后不會(huì)被冋收的原因。構(gòu)建一個(gè)閉包,這

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。