亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript作用域深度剖析之動(dòng)態(tài)作用域

 更新時(shí)間:2023年05月23日 10:13:48   作者:控心crazy  
這篇文章主要為大家介紹了?JavaScript作用域?qū)W習(xí)之動(dòng)態(tài)作用域深度剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

在之前的文章中, 我們說了作用域一共分為兩種:詞法作用域和動(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)文章

最新評(píng)論