[{"data":1,"prerenderedAt":130},["ShallowReactive",2],{"post-engineering/javascript-scope":3},{"id":4,"title":5,"body":6,"date":119,"description":120,"extension":121,"meta":122,"navigation":123,"path":124,"seo":125,"stem":126,"tags":127,"__hash__":129},"content/engineering/作用域.md","JavaScript的作用域",{"type":7,"value":8,"toc":112},"minimark",[9,21,25,32,59,61,68,71,96,99,102],[10,11,13,14],"h1",{"id":12},"作用域与词法环境","作用域与",[15,16,20],"a",{"href":17,"rel":18},"https://zh.javascript.info/closure",[19],"nofollow","词法环境",[22,23,24],"h4",{"id":24},"作用域",[26,27,28],"blockquote",{},[29,30,31],"p",{},"作用域(Scope)是指程序源代码中定义变量或函数的区域，决定了它们的可被访问的范围",[29,33,34,37,38,43,44,49,50,54,55,58],{},[35,36,24],"strong",{},"是当前的执行上下文，",[15,39,42],{"href":40,"rel":41},"https://developer.mozilla.org/zh-CN/docs/Glossary/Value",[19],"值","和表达式在其中“可见”或可被访问。如果一个",[15,45,48],{"href":46,"rel":47},"https://developer.mozilla.org/zh-CN/docs/Glossary/Variable",[19],"变量","或表达式不在当前的作用域中，那么它是不可用的。作用域也可以堆叠成层次结构，子作用域可以访问父作用域，反过来则不行。\n",[51,52,53],"code",{},"let","与",[51,56,57],{},"const"," 声明的变量属于块级作用域。",[22,60,20],{"id":20},[29,62,63,64,67],{},"在 JavaScript 中，每个运行的函数，代码块",[51,65,66],{},"{...}","以及整个脚本，都有一个被称为**词法环境（Lexical Environment）**的内部（隐藏）的关联对象。",[29,69,70],{},"词法环境对象由两部分组成：",[72,73,74,85],"ol",{},[75,76,77,80,81,84],"li",{},[35,78,79],{},"环境记录（Environment Record）","—— 一个存储所有局部变量作为其属性（包括一些其他信息，例如",[51,82,83],{},"this","的值）的对象。",[75,86,87,88,91,92,95],{},"对",[35,89,90],{},"外部词法环境","的引用，与外部代码相关联。\n一个“变量”只是",[35,93,94],{},"环境记录","这个特殊的内部对象的一个属性。“获取或修改变量”意味着“获取或修改词法环境的一个属性”。",[22,97,98],{"id":98},"作用域链",[29,100,101],{},"当需要解析某个变量或函数时，解释器会首先在当前的词法环境中查找，如果没有找到，则会沿着外部环境引用一级级向上查找,直到找到该变量或函数，或者抵达了全局词法环境。这个查找过程就构成了作用域链(Scope Chain)。",[29,103,104,105,111],{},"因此，",[106,107,110],"mark",{"className":108},[109],"hltr-orange","作用域确定了变量和函数的可被访问范围,而词法环境则是存储和解析它们的数据结构","。一个特定的作用域对应了一个词法环境。词法环境通过外部环境引用把内部作用域和外部作用域连接起来，形成了作用域链，从而实现了作用域的工作机制。",{"title":113,"searchDepth":114,"depth":114,"links":115},"",4,[116,117,118],{"id":24,"depth":114,"text":24},{"id":20,"depth":114,"text":20},{"id":98,"depth":114,"text":98},"2024-04-12","记录了我对作用域与词法环境的理解","md",{},true,"/engineering/javascript-scope",{"title":5,"description":120},"engineering/作用域",[128],"JavaScript","TNCdknieZ0h79DeUSW3cSo3UeVFA8XtKj4zyb2oY93A",1776757930045]