JavaScript作用域深度剖析之動(dòng)態(tài)作用域
前言
在之前的文章中, 我們說了作用域一共分為兩種:詞法作用域和動(dòng)態(tài)作用域,而這篇文章我們一起來學(xué)習(xí) 動(dòng)態(tài)作用域。
動(dòng)態(tài)作用域
- 動(dòng)態(tài)作用域似乎有著很好的理由讓作用域作為一個(gè)在運(yùn)行時(shí)就被動(dòng)態(tài)確定的形式,而不是在寫代碼時(shí)進(jìn)行靜態(tài)確定的形式。
考慮一下代碼:
function foo() { console.log(a); // 2 } function bar() { var a = 3; foo(); } var a = 2; bar();
- 在上述代碼中,詞法作用域讓 foo() 中的 a 通過 RHS 引用到了全局作用域中的 a, 因此輸出 2;
- 在動(dòng)態(tài)作用域中,它并不關(guān)心函數(shù)和作用域是如何聲明以及在何處聲明的,只關(guān)心他們從何處調(diào)用的。換句話說,作用域鏈?zhǔn)腔谡{(diào)用棧的,而不是代碼中的作用域嵌套的。
- 如果 JavaScript 具有動(dòng)態(tài)作用域,理論上,上述代碼 foo() 中的 a 輸出 3; 因?yàn)?foo() 是在 bar() 中調(diào)用的,
為什么會(huì)這樣?
- 因?yàn)楫?dāng) foo() 無法找到 a 的變量引用是,會(huì)順著調(diào)用棧在調(diào)用 foo() 的地方查找 a,而不是在嵌套的詞法作用域鏈中向上查找。由于 foo() 是在 bar() 中調(diào)用的,引擎會(huì)檢查 bar() 的作用域,并找到值為 3 的變量 a。
是不是很奇怪?
- 但這其實(shí)是因?yàn)槟憧赡苤粚戇^基于詞法作用域的代碼,因此對(duì)動(dòng)態(tài)作用域感到陌生。如果你只用基于動(dòng)態(tài)作用域的語言寫過代碼,就會(huì)覺得很自然的,而詞法作用域看上去才怪怪的。
- 事實(shí)上 JavaScript 并不具有動(dòng)態(tài)作用域,它只有詞法作用域。但 this 機(jī)制的存在在某種程度上很像動(dòng)態(tài)作用域。
詞法作用域與動(dòng)態(tài)作用域的區(qū)別?
- 動(dòng)態(tài)作用域其實(shí)是 JavaScript 另一個(gè)重要機(jī)制 this 的表親
- 詞法作用域是在書寫代碼或定義時(shí)確定的
- 動(dòng)態(tài)作用域是在運(yùn)行時(shí)確定的。(this 也是)
- 詞法作用域關(guān)注函數(shù)在何處聲明
- 動(dòng)態(tài)作用域關(guān)注函數(shù)從何處調(diào)用
- 其實(shí)在 JavaScript 中的作用域大多為詞法作用域。
- 作用域鏈?zhǔn)腔谡{(diào)用棧的,而不是代碼中的作用域嵌套的
特殊字符描述:
- 問題標(biāo)注
Q:(question)
- 答案標(biāo)注
R:(result)
- 注意事項(xiàng)標(biāo)準(zhǔn):
A:(attention matters)
- 詳情描述標(biāo)注:
D:(detail info)
- 總結(jié)標(biāo)注:
S:(summary)
- 分析標(biāo)注:
Ana:(analysis)
- 提示標(biāo)注:
T:(tips)
以上就是 JavaScript作用域深度剖析之動(dòng)態(tài)作用域的詳細(xì)內(nèi)容,更多關(guān)于JavaScript動(dòng)態(tài)作用域的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
HTML+JavaScript實(shí)現(xiàn)掃雷小游戲
這篇文章主要為大家詳細(xì)介紹了HTML+JavaScript實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09js實(shí)現(xiàn)點(diǎn)小圖看大圖效果的思路及示例代碼
點(diǎn)小圖看大圖的效果想必很多的朋友都有見到過吧,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下2013-10-10JS實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊箭頭旋轉(zhuǎn)180度功能
這篇文章主要介紹了JS實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊箭頭旋轉(zhuǎn)180度的效果,通過點(diǎn)擊三角按鈕旋轉(zhuǎn)180度,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2024-02-02適用于javascript開發(fā)者的Processing.js入門教程
這篇文章主要介紹了適用于javascript開發(fā)者的Processing.js入門教程,感興趣的小伙伴們可以參考一下2016-02-02js實(shí)現(xiàn)背景圖自適應(yīng)窗口大小
本文分享了背景圖自適應(yīng)窗口大小的實(shí)例代碼,具有一定的參考作用。下面跟著小編一起來看下吧2017-01-01javascript中call,apply,bind函數(shù)用法示例
這篇文章主要介紹了javascript中call,apply,bind函數(shù)用法,結(jié)合實(shí)例形式分析了call,apply,bind函數(shù)的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-12-12JS實(shí)現(xiàn)對(duì)JSON數(shù)據(jù)進(jìn)行冒泡排序
JavaScript 是一種廣泛使用的腳本語言,JSON是一種常見的數(shù)據(jù)格式,這篇文章主要來探討一下如何使用 JavaScript 對(duì) JSON 數(shù)據(jù)進(jìn)行冒泡排序,感興趣的可以了解一下2023-06-06