图解JavaScript作用域与作用域链

现在让我们深入研究JavaScript作用域和作用域链。
首先,确保您对执行上下文有一定的了解,尽管稍后我将对此进行更详细的介绍。
接下来,让我们通过一个例子来理解这个概念。
考虑以下代码:getPersonInfo()函数返回一个包含姓名、年龄和城市信息的字符串,例如:“Sarahis22andlivesinSanFrancisco”。
奇怪的是,getPersonInfo()函数本身并没有定义城市,但是它是如何得到这个值的呢?关键是JavaScript中的内存管理和作用域。
每个函数都有一个本地上下文,因此有一个作用域链。
对于getPersonInfo()函数来说,作用域链是这样的(我们暂不详述):...作用域链就像一个链式结构,包含了所有可以访问的值及其引用执行上下文。
当创建执行上下文时,作用域链也随之形成,这意味着它是动态生成的。
这是关于范围,而不是执行上下文或活动对象。
在以下示例中,执行上下文中的键值对表示作用域链中包含的变量引用。
...当函数尝试访问变量时,它首先在本地范围中查找。
例如,在getPersonInfo()中,name和age都有引用,它们的值分别是Sarah和22,但是,当尝试访问“city”时,引擎会搜索范围链,直到到达全局范围,因为。
“city”在全局范围内声明为值“SanFrancisco”。
一旦理解了这一点,就更容易想象一个瀑布模型:搜索不是向上的,而是在外部区域。
...我们将通过一个实际案例来展示这一点。
在下面的代码中:...主要区别是city变量仅在getPersonInfo()中定义,而不是在全局范围内。
在这里,如果您尝试在全局范围内访问Name、Age和City,则会引发ReferenceError,因为全局范围内没有对城市的引用,并且没有查找它的机制。
作用域提供了一种保护变量和重用变量名的机制。
另外,还有块级作用域,用let或const声明的变量仅在定义它们的代码块作用域内有效。
最后用一个图来概括:全局作用域、函数作用域和块级作用域共同构成了JavaScript的作用域结构。
这就是区域和区域链的介绍。
我希望这有帮助。
由LydiaHallie撰写,更多内容请参见dev.to/lydiahallie/java...

javascript作用域的问题

this.name中的名称是对象的属性,单个名称是变量。
它们是不同的概念,与范围无关。