闭包
javascript - 闭包
ES5、
2017-12-08
资料整理
简述
函数的执行依赖变量作用域,这个作用域是在函数定义时决定的,而不是函数执行时决定的。为了实现这种词法作用域,JavaScript
函数对象的内部
状态不仅包含函数的代码逻辑,还必须引用当前的作用域链。函数对象可以通过作用域链互相关联起来,函数体内部的变量都可以保存在函数的作用域内,
这就是 “闭包”。
也就是说:函数定义时的作用域链到函数执行的时候依然有效。
简单来说,闭包就是指可以访问另一个函数作用域变量的函数,一般是定义在外部函数中的内层函数。
var a = 'window'
function check(){
var a = 'local';
function f(){
console.log(a);
}
return f;
}
check()() // local
JavaScript
的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。
var uniqueInteger = (function(){
var count = 0;
return function(){ return count++ }
}())
闭包的意义
局部变量无法共享和长久的保存,而全局变量可能造成变量污染。
闭包的特点
- 占用更多的内存
- 不容易被释放
何时使用闭包?
既想反复使用,又想避免全局污染。
如何使用闭包?
- 定义外层函数,封装被保护的局部变量。
- 定义内层函数,执行对外部函数变量的操作。
- 外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。