闭包官方定义:闭包是指程序中有许多变量和绑定变量的执行环境。
本人自己理解:程序的代码段允许存在一级函数并且一级函数不能被释放,一级函数没有释放之前,外部可以使用一级函数的局部变量。
进一步理解 : 闭包就是外部可以使用局部变量。
闭包的功能:1、外部可以使用局部变量。
2、使函数不能释放。
闭包的缺点:外部会修改局部变量,会大量占用内存,内存不会被释放。
为什么一级函数不能被释放?
答:因为一级函数中有一个函数,这个函数使用了一级函数的变量,我们返回了这个函数并创建一个变量接收了。那么这个函数就不会被js的垃圾回收机制销毁。
最常用的一种形式是函数作为返回值被返回
var F = function(){ var b = 'local'; var N = function(){ return b; } return N; } console.log(F()());
一种变形的形式是将内部函数赋值给一个外部变量
var inner; var F = function(){ var b = 'local'; var N = function(){ return b; }; inner = N; }; F(); console.log(inner());
闭包可以通过函数参数传递函数的形式来实现
var Inner = function(fn){ console.log(fn()); } var F = function(){ var b = 'local'; var N = function(){ return b; } Inner(N); } F();
我们通过提供getter()和setter()函数来将要操作的变量保存在函数内部,防止其暴露在外部
var getValue,setValue; (function(){ var secret = 0; getValue = function(){ return secret; } setValue = function(v){ if(typeof v === 'number'){ secret = v; } } })(); console.log(getValue());//0 setValue(1); console.log(getValue());//1
使用闭包可以很方便的实现一个迭代器
function setup(x){ var i = 0; return function(){ return x[i++]; } } var next = setup(['a','b','c']); console.log(next());//'a' console.log(next());//'b' console.log(next());//'c'
谢谢大家