亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

JavaScript作用域深度剖析:動態作用域

標簽:
Html5 JavaScript

前言

  • 在上篇文章中, 我们说了作用域一共分为两种:词法作用域动态作用域,而这篇文章我们一起来学习 动态作用域

动态作用域

  • 动态作用域似乎有着很好的理由让作用域作为一个在运行时就被动态确定的形式,而不是在写代码时进行静态确定的形式。
  • 考虑一下代码:
function foo() {
    console.log(a); // 2
}

function bar() {
    var a = 3;
    foo();
}

var a = 2;
bar();
  • 在上述代码中,词法作用域让 foo() 中的 a 通过 RHS 引用到了全局作用域中的 a, 因此输出 2;

  • 在动态作用域中,它并不关心函数和作用域是如何声明以及在何处声明的,只关心他们从何处调用的。换句话说,作用域链是基于调用栈的,而不是代码中的作用域嵌套的。

  • 如果 JavaScript 具有动态作用域,理论上,上述代码 foo() 中的 a 输出 3; 因为 foo() 是在 bar() 中调用的,

  • 为什么会这样?

    • 因为当 foo() 无法找到 a 的变量引用是,会顺着调用栈在调用 foo() 的地方查找 a,而不是在嵌套的词法作用域链中向上查找。由于 foo() 是在 bar() 中调用的,引擎会检查 bar() 的作用域,并找到值为 3 的变量 a。
  • 是不是很奇怪?

    • 但这其实是因为你可能只写过基于词法作用域的代码,因此对动态作用域感到陌生。如果你只用基于动态作用域的语言写过代码,就会觉得很自然的,而词法作用域看上去才怪怪的。
  • 事实上 JavaScript 并不具有动态作用域,它只有词法作用域但 this 机制的存在在某种程度上很像动态作用域。

词法作用域与动态作用域的区别?

  • 动态作用域其实是 JavaScript 另一个重要机制 this 的表亲
  • 词法作用域是在书写代码或定义时确定的
  • 动态作用域是在运行时确定的。(this 也是)
  • 词法作用域关注函数在何处声明
  • 动态作用域关注函数从何处调用
  • 其实在 JavaScript 中的作用域大多为词法作用域。
  • 作用域链是基于调用栈的,而不是代码中的作用域嵌套的

特殊字符描述:

  1. 问题标注 Q:(question)
  2. 答案标注 R:(result)
  3. 注意事项标准:A:(attention matters)
  4. 详情描述标注:D:(detail info)
  5. 总结标注:S:(summary)
  6. 分析标注:Ana:(analysis)
  7. 提示标注:T:(tips)
點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
Web前端工程師
手記
粉絲
6
獲贊與收藏
41

關注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 1
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消