闭包
概念
函数的执行依赖于变量的作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的,为了实现这种词法作用域,JS函数对象的内部状态不仅包含函数的代码逻辑,还必须引用当前的作用域链。函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性叫做闭包
闭包是指有权访问另一个函数作用域中变量的函数
(函数套函数)1.函数作为一参数被传入2.函数被当做返回值返回
作用
- 可以在函数的外部访问到函数内部的局部变量
- 让这些变量始终保存在内存中,不会随着函数的结束而自动销毁
- 闭包可以实现局部变量,避免全局变量污染
- 闭包中的自由变量的查找在函数定义的地方而不是执行的地方
function add(){
var sum = 0;
function operation(){
return sum = sum?sum+1:1;
}
return operation
}
var a = add();
console.log(a());//1
console.log(a());//2
console.log(a());//3
console.log(a());//4
a = null;
a = add();
console.log(a());//1
特点
- 被闭包引用的局部变量,不会被销毁
- 封装,闭包可以实现局部变量,避免全局变量污染
- 闭包中的自由变量的查找在函数定义的地方而不是执行的地方
作用域链
函数中所能访问的变量按照层级关系组成的一条有着先后顺序的链子。所以每个函数最先能访问的变量是当前函数的活动对象,其次下一个能访问到的变量就是当前函数所在的包含环境,然后是下下个包含环境。这样一层层的找下去,直到找到全局执行环境为止。