闭包
概念:闭包是指有权访问另外一个函数作用域中的变量的函数
作用域链
当访问一个变量时,解释器会首先在当前作用域查找标示符,如果没有找到,就去父作用域找,直到找到该变量的标示符或者不在父作用域中,这就是作用域链。
作用域
JavaScript中的词法作用域,在函数定义的时候就被创建。闭包函数由于引用来外层函数中的变量,所以闭包的作用域链上会保存外层函数的变量引用。即使外层函数被销毁,由于其词法作用域的变量还在被闭包所引用,所以这些变量就会继续保存在内存中不会被垃圾回收。
与原型链的区别
如果去查找一个普通对象的属性,但是在当前对象和其原型中都找不到时,会返回undefined;但查找的属性在作用域链中不存在的话就会抛出ReferenceError。
闭包应用
- 函数柯里化
- 局部变量如单例模式
- 函数封装