昨天介绍了,JS中函数的做用域html
什么词法环境之类的,可能不少小伙伴不太明白。闭包
在今天的内容开始以前,先作个简短的声明:函数
词法环境这一律念是在ES5中提出的,由于词法环境主要用于保存let、const声明的变量、函数spa
而在ES3中对变量相关的信息都保存在变量对象上;设计
从功能上来讲变量对象能够看做是词法环境中的环境记录htm
二者从功能上来讲区别不大,只是不一样版本的ES有不一样的说法对象
为了保持与前文的一致,这篇文章中我仍是用环境记录来描述JS保存当前执行环境(上下文)中定义的变量和函数的对象blog
ES6以前JS中的做用域只有全局做用域和局部做用域(函数做用域)两种,后文将基于此进行解释作用域
做用域联系前文咱们能够理解为执行环境(上下文)中的词法环境get
而每一个做用域都由一个保存变量的对象(环境记录)和一个指向外部词法环境的outer(对外部环境引用)构成
做用域之间的嵌套关系由outer来维护
一个个做用域经过outer造成的链式结构就被称做做用域链
在《js高级程序设计》中把执行栈顶端的执行环境(上下文)中的做用域(词法环境)称为活动对象
那么做用域链是干吗的呢?
做用域链就是让咱们能在子做用域中访问父做用域链中的变量的
在解释做用域的时候我提过,每一个做用域都包含了一个对外部做用域的引用,这个引用是单向的
这也是子做用域能访问父做用域,而父做用域不能访问子做用域的缘由
当咱们在使用变量的时候,JS会解析标识符,解析实际上就是一个沿着做用域链一层层搜索标识符的过程
在搜索标识符这一过程当中,只要搜索到符合的标识符就会当即中止搜索
这也就是当父级做用域和子做用域有同名变量时,JS以子做用域中的为准的缘由
在JS中除了函数以外,还有一些语句也会产生做用域,从而延长做用域
1.try-catch中的catch会产生一个新的做用域
2.with语句 会将指定对象做为做用域添加到执行栈的顶端
在使用上方的语句时须要注意一下
PS . IE8 以前的JS版本中catch会将错误对象添加到当前的执行环境的变量对象中,而不是新建一个,IE9中修复了该bug
在ES6以前JS是没有块级做用域的,也就是大括号之间的代码块不会产生一个独立的做用域
也就是说花括号中间声明的变量会添加到当前的执行环境中
这也是for循环中声明的 i 在外部也能访问的缘由
最近的文章可能都没有什么例子的配合了,一是有些东西实在很差举例,二是本身水平有限
望谅解,JS中的闭包等问题会在后面介绍object里面的function类型的时候介绍