发布于 2024 年 2 月 26 日,星期一
JavaScript作用域深度剖析:动态作用域的核心在于理解作用域的动态特性,即变量的作用域不仅由代码结构决定,还受函数调用时的上下文影响。与静态作用域(词法作用域)不同,动态作用域在运行时确定,使得变量的查找路径依赖于调用栈而非代码的嵌套结构。这种特性使得代码在不同上下文中执行时,变量的引用可能发生变化,增加了代码的灵活性但也带来了潜在的复杂性和调试难度。理解动态作用域的关键在于把握变量在运行时的实际引用,而非仅仅依赖于代码的静态分析。
系列首发于公众号『非同质前端札记』https://mp.weixin.qq.com/s?__biz=MzkyOTI2MzE0MQ==&mid=2247485576&idx=1&sn=5ddfe93f427f05f5d126dead859d0dc8&chksm=c20d73c2f57afad4bbea380dfa1bcc15367a4cc06bf5dd0603100e8bd7bb317009fa65442cdb&token=1071012447&lang=zh_CN#rd ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。
词法作用域
和动态作用域
,而这篇文章我们一起来学习 动态作用域
。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() 中调用的,
为什么会这样?
是不是很奇怪?
事实上 JavaScript 并不具有动态作用域,它只有词法作用域
。但 this 机制的存在在某种程度上很像动态作用域。
Q:(question)
R:(result)
A:(attention matters)
D:(detail info)
S:(summary)
Ana:(analysis)
T:(tips)