JavaScript作用域深度剖析之動態(tài)作用域
更新時間:2023年05月23日 10:13:48 作者:控心crazy
這篇文章主要為大家介紹了?JavaScript作用域學習之動態(tài)作用域深度剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
前言
在之前的文章中, 我們說了作用域一共分為兩種:詞法作用域和動態(tài)作用域,而這篇文章我們一起來學習 動態(tài)作用域。
動態(tài)作用域
- 動態(tài)作用域似乎有著很好的理由讓作用域作為一個在運行時就被動態(tài)確定的形式,而不是在寫代碼時進行靜態(tài)確定的形式。
考慮一下代碼:
function foo() { console.log(a); // 2 } function bar() { var a = 3; foo(); } var a = 2; bar();
- 在上述代碼中,詞法作用域讓 foo() 中的 a 通過 RHS 引用到了全局作用域中的 a, 因此輸出 2;
- 在動態(tài)作用域中,它并不關心函數和作用域是如何聲明以及在何處聲明的,只關心他們從何處調用的。換句話說,作用域鏈是基于調用棧的,而不是代碼中的作用域嵌套的。
- 如果 JavaScript 具有動態(tài)作用域,理論上,上述代碼 foo() 中的 a 輸出 3; 因為 foo() 是在 bar() 中調用的,
為什么會這樣?
- 因為當 foo() 無法找到 a 的變量引用是,會順著調用棧在調用 foo() 的地方查找 a,而不是在嵌套的詞法作用域鏈中向上查找。由于 foo() 是在 bar() 中調用的,引擎會檢查 bar() 的作用域,并找到值為 3 的變量 a。
是不是很奇怪?
- 但這其實是因為你可能只寫過基于詞法作用域的代碼,因此對動態(tài)作用域感到陌生。如果你只用基于動態(tài)作用域的語言寫過代碼,就會覺得很自然的,而詞法作用域看上去才怪怪的。
- 事實上 JavaScript 并不具有動態(tài)作用域,它只有詞法作用域。但 this 機制的存在在某種程度上很像動態(tài)作用域。
詞法作用域與動態(tài)作用域的區(qū)別?
- 動態(tài)作用域其實是 JavaScript 另一個重要機制 this 的表親
- 詞法作用域是在書寫代碼或定義時確定的
- 動態(tài)作用域是在運行時確定的。(this 也是)
- 詞法作用域關注函數在何處聲明
- 動態(tài)作用域關注函數從何處調用
- 其實在 JavaScript 中的作用域大多為詞法作用域。
- 作用域鏈是基于調用棧的,而不是代碼中的作用域嵌套的
特殊字符描述:
- 問題標注
Q:(question)
- 答案標注
R:(result)
- 注意事項標準:
A:(attention matters)
- 詳情描述標注:
D:(detail info)
- 總結標注:
S:(summary)
- 分析標注:
Ana:(analysis)
- 提示標注:
T:(tips)
以上就是 JavaScript作用域深度剖析之動態(tài)作用域的詳細內容,更多關于JavaScript動態(tài)作用域的資料請關注腳本之家其它相關文章!
相關文章
適用于javascript開發(fā)者的Processing.js入門教程
這篇文章主要介紹了適用于javascript開發(fā)者的Processing.js入門教程,感興趣的小伙伴們可以參考一下2016-02-02javascript中call,apply,bind函數用法示例
這篇文章主要介紹了javascript中call,apply,bind函數用法,結合實例形式分析了call,apply,bind函數的功能、使用方法與相關注意事項,需要的朋友可以參考下2016-12-12