JavaScript作用域深度剖析之动态作用域
更新时间:2023年05月23日 10:13:48 作者:控心crazy
这篇文章主要为大家介绍了 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 中的作用域大多为词法作用域。
- 作用域链是基于调用栈的,而不是代码中的作用域嵌套的
特殊字符描述:
- 问题标注
Q:(question)
- 答案标注
R:(result)
- 注意事项标准:
A:(attention matters)
- 详情描述标注:
D:(detail info)
- 总结标注:
S:(summary)
- 分析标注:
Ana:(analysis)
- 提示标注:
T:(tips)
以上就是 JavaScript作用域深度剖析之动态作用域的详细内容,更多关于JavaScript动态作用域的资料请关注脚本之家其它相关文章!
相关文章
Javascript中关于Array.filter()的妙用详解
大家应该都知道filter是Javascript中Array常用的操作,它用于把Array的某些元素过滤掉,然后返回剩下的元素。下面这篇文章就给大家介绍了关于Javascript中Array.filter()的妙用,有需要的朋友们可以参考借鉴,下面来一起看看吧。2016-12-12OkHttp踩坑随笔为何 response.body().string() 只能调用一次
想必大家都用过或接触过 OkHttp,我最近在使用 Okhttp 时,就踩到一个坑,在这儿分享出来,以后大家遇到类似问题时就可以绕过去2018-01-01JS实现的Object数组去重功能示例【数组成员为Object对象】
这篇文章主要介绍了JS实现的Object数组去重功能,可实现针对数组成员为Object对象的去重复功能,涉及javascript数组元素遍历、属性判断等相关操作技巧,需要的朋友可以参考下2019-02-02浅谈typescript中keyof与typeof操作符用法
本文主要介绍了typescript中keyof与typeof操作符用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-06-06
最新评论