静态作用域
-词法作用域 (在编译阶段就能够决定变量的引用)
-由程序定义的位置决定
动态作用域
-程序运行时刻决定 动态栈 找最近的
js的变量作用域
-js使用的是静态作用域
-js没有块级作用域 (只有函数作用域,if和for不会产生作用域)
-ES5中使用词法环境管理静态作用域
词法环境的组成
-环境记录(形参、变量、函数等)
-对外部词法环境的引用(outer指针),形成一种嵌套的结构。最外层的outer是null
什么时候创建词法环境?
-一段代码开始执行前, 先初始化词法环境 函数的形参、函数定义(函数声明)、变量定义(var)
所有var 定义的变量初始化到环境变量里面值都是undefined的形式的。函数定义初始化会将形参、函数体放到函数对象里面,保存当前的作用域(当看见函数定义的时候会把当前函数的作用域保存到这个函数对象里面)
词法环境的一些问题:
-形参、函数定义、变量 定义名称冲突。(优先级大到小 函数定义>形参>变量)
-arguments (实参)
-函数表达式(执行到函数表达式语句才创建函数对象才设置作用域)
在函数的执行的过程中,函数的词法环境是可以改变的。