作用域链在函数创建时基于词法位置确定,包含函数能访问的所有外部作用域引用;当访问变量时,JavaScript 引擎从当前执行上下文开始,沿作用域链逐级向上查找,直至全局作用域;由于作用域链定义时确定,即使外层函数已执行完毕,内部函数仍可通过保留的引用访问其变量,形成闭包。

JavaScript 作用域链的形成与函数的定义位置密切相关,它是在函数创建时确定的,而不是在调用时。
作用域链是什么
作用域链是 JavaScript 引擎用来查找变量和函数的一套规则。当代码访问一个标识符(比如变量或函数名)时,引擎会从当前执行上下文的变量环境中开始查找,如果没找到,就沿着作用域链向上一级作用域查找,直到全局作用域为止。
作用域链的形成时机
作用域链在函数定义时就已经确定,取决于函数在代码中所处的词法位置,这也就是“词法作用域”(Lexical Scoping)的核心思想。
具体过程如下:
立即学习“Java免费学习笔记(深入)”;
每个函数在被创建时,都会有一个内部属性 [[Scope]],它保存了该函数能访问的所有外部作用域的引用列表 这个列表按照嵌套关系从内到外排列,最内层是当前函数的父级作用域,然后是父级的父级,一直到全局作用域 当函数执行时,会创建一个执行上下文,此时将当前的变量对象加入作用域链前端,形成完整的查找链条
举例说明
看一个典型例子:
function outer() { let a = 1; function inner() { console.log(a); // 能访问到 outer 中的 a } inner();}outer();
在这个例子中:
inner 函数定义在 outer 内部,因此它的 [[Scope]] 包含 outer 的作用域 当 inner 执行时,作用域链包含:inner 自己的作用域 → outer 的作用域 → 全局作用域 所以访问变量 a 时,先查 inner 自身,没找到就去 outer 中找,成功获取到值
闭包与作用域链的关系
即使 outer 函数已经执行完毕,如果 inner 被外部引用并调用,inner 依然能访问 outer 中的变量。这是因为 inner 的作用域链仍然保留着对 outer 变量对象的引用,这就是闭包的实现原理。
这也说明了作用域链不是动态生成的,而是基于函数定义的位置静态决定的。
基本上就这些。作用域链的关键在于“定义时确定”,理解这一点就能掌握大多数变量查找的行为。不复杂但容易忽略的是,它和函数在哪里调用无关,只和在哪里定义有关。
以上就是javascript_作用域链的形成过程的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1539973.html
微信扫一扫
支付宝扫一扫