一 概念
即变量的生命周期和作用范围。
分为全局作用域,局部作用域。两个方面:
当看到一个变量时,需要知道其生命周期和作用域;
知道这个变量是在哪里定义的变量。
二 变量作用域解析
1 静态作用域
也称词法作用域。
由程序定义位置决定,编译时决定。与代码执行顺序无关。
例子: foo() 函数会找到全局作用域的 x 值。
2 动态作用域
由程序运行时决定。
例子: 使用栈,选择最近的 x 值。
3 Js 变量作用域
Js 使用静态作用域;
Js 没有块级作用域(只有函数才会创建一个新的作用域,if,for 语句等都不会产生新的作用域);
ES5 中使用词法环境管理静态作用域。
4 词法环境
组成:环境记录(形参,变量,函数等);对外部词法环境的引用。
一段代码开始执行前,先初始化词法环境。Js 中只有全局和函数代码。
词法环境结构:
变量顺着链一级级找。问题:
函数定义优先级高于形参,形参定义优先级高于变量定义(定义发生冲突时)。
函数表达式和函数定义不同,前者的函数对象是执行到时才创建(词法环境可能会发生变化),后者的函数对象是代码执行前就定义了。
try…catch: