内容编写中
全局作用域
全局作用域是指变量在整个程序中都可见和可访问的,在全局作用域声明的变量在程序的任何地方都可以被引用
函数作用域
在函数内部声明的变量具有函数作用域,意味着他们只能在函数内部访问。这种作用域规则意味着函数外部无法访问函数内部的变量
块级作用域
通过let和const声明的的变量,可以在if语句,for循环,while循环等代码块内访问到,在代码块外部无法访问到
显式创建块级作用域
- 使用花括号 { } 显示创建一个块级作用域,在这个块级作用域内声明的变量只在该块中可见
javascript
{
// 这是一个块级作用域
let blockScopedVar = 10;
// 其他代码...
}
// 这里无法访问 blockScopedVar
隐式创建块级作用域
在javascript中,很多结构会隐式地创建块级作用域,例如
- if 语句
javascript
if (true) {
// 这是一个块级作用域
let blockScopedVar = 10;
}
- for 循环
javascript
for (let i = 0; i < 5; i++) {
// 这是一个块级作用域
console.log(i);
}
// 这里无法访问 i
- while 语句
javascript
while (true) {
// 这是一个块级作用域
let blockScopedVar = 10;
// 其他代码...
break; // 跳出循环
}
变量提升
作用域延申
变量提升规则
- 函数声明被优先提升
- 变量声明被提升
- 重复的声明不会被提升
作用域链
- 在当前作用域中查找所需变量,但是该作用域没有这个变量,那这个变量就是自由变量。如果在自己作用域找不到该变量就会去父级作用域查找,以此向上级作用域查找,直到访问到window对象被终止,这一层层得关系就是作用域链
- 作用域链的作用式保证对执行环境有权访问的变量和函数的有序访问,通过作用域链,可以访问到外层环境的变量和函数
- 作用域链的本质上是一个指向变量对象的指针列表,变量对象是一个包含执行环境中所有的变量和函数的对象。作用域链的前端始终都是当前执行上下文的变量对象。全局执行上下文的变量对象(全局对象)始终是作用域链的最后一个对象。
- 当查找一个变量是,如果当前执行环境没有找到,可以沿着作用域链向后查找。