函数调用时,局部作用域被创建,函数执行完毕,局部作用域被销毁
函数多次被调用每次都会重新创建一个新的独立函数作用域
函数作用域可以访问上层作用域,但是相邻函数作用域是独立的
ES6以前没有块级作用域
ES6中的块级作用域:通过let和const进行声明,和其他作用域一样,对外不可见
作用域链的用途,是保证对执行环境有权访问的所有变量和函数的有序访问。
为什么函数执行完成后打印函数对象只能看到global?为什么闭包会导致内存泄漏?这些都是作用域链底层导致
- var a = 1
- function fn () {
- var b = a + 1
- console.log(b)
- }
- // 查看创建时函数下的对象
- console.dir(fn);
- // fn()

发现在函数创建到执行完成期间,会创建一个局部作用域即Local,执行完成后,这个Local会被销毁

每个作用域链里面都有一个变量对象,其中函数所包含的称为活动对象AO(Active Object),每个函数包含着对上一个变量对象的引用,如果变量在当前作用域中找不到,就会通过作用域链找到他的上一级,上一级也找不到就会继续往上找,最终会找到window全局作用域,全局作用域也找不到就会打印not defined并报错。
- function books () {
- var book = '书包里面的书本'
- return function () {
- console.log(book)
- }
- }
- var bag = books()
- bag()
整个执行过程:
整个过程中books()的Local作用域变量对象都不会被销毁。如果这种情况多了就会造成内存泄漏。
books的Local作用域对象不是在books执行完立即销毁,这是由垃圾回收机制决定的,因为这里bag()函数还会读取Local变量对象中的数据,所以不会销毁。
books的Local作用域为什么不会立即销毁?执行上下文中进行代码预编译时就会确认,global,books,bag这些函数的关系。这里发现bag()还会调用,所以就不会进行销毁