欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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)作用域中,它并不關心函數(shù)和作用域是如何聲明以及在何處聲明的,只關心他們從何處調用的。換句話說,作用域鏈是基于調用棧的,而不是代碼中的作用域嵌套的。
  • 如果 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 也是)
  • 詞法作用域關注函數(shù)在何處聲明
  • 動態(tài)作用域關注函數(shù)從何處調用
  • 其實在 JavaScript 中的作用域大多為詞法作用域。
  • 作用域鏈是基于調用棧的,而不是代碼中的作用域嵌套的

特殊字符描述:

  • 問題標注 Q:(question)
  • 答案標注 R:(result)
  • 注意事項標準:A:(attention matters)
  • 詳情描述標注:D:(detail info)
  • 總結標注:S:(summary)
  • 分析標注:Ana:(analysis)
  • 提示標注:T:(tips)

以上就是 JavaScript作用域深度剖析之動態(tài)作用域的詳細內容,更多關于JavaScript動態(tài)作用域的資料請關注腳本之家其它相關文章!

相關文章

最新評論