闭包在JavaScript中无处不在。
在了解闭包之前,必须对JavaScript的词法作用域有所了解。
闭包是在函数声明时所创建的作用域,它使得函数能够访问并处理函数的外部变量。换句话说,闭包可以让函数访问到在函数声明时处于作用域中的所有变量以及其函数。
–摘自《JavaScript编程精粹》
闭包是由函数以及创建该函数的词法环境组合而成。这个环境包含了这个闭包创建时所能访问的所有局部变量。
–摘自MDN
闭包是内部函数在其父函数已经终止之后可以引用其外部封闭函数中存在的变量的一种手段。
–摘自某介绍闭包的网站
闭包目的:不允许提升变量作用域时,该函数的局部变量需要被其他函数使用。
闭包本质:函数的嵌套,内层函数称之为闭包。
–摘自https://www.cnblogs.com/linagcheng/p/9799897.html
模块模式
用闭包模拟私有方法
1 | var Counter = (function() { |
只创建了一个词法环境,为三个函数所共享:Counter.increment,Counter.decrement 和 Counter.value。
该共享环境创建于一个立即执行的匿名函数体内。这个环境中包含两个私有项:名为 privateCounter 的变量和名为 changeBy 的函数。这两项都无法在这个匿名函数外部直接访问。必须通过匿名函数返回的三个公共函数访问。
这三个公共函数是共享同一个环境的闭包。多亏 JavaScript 的词法作用域,它们都可以访问 privateCounter 变量和 changeBy 函数。
循环与闭包
闭包只能取得包含函数中任何变量的最后一个值。
具体案例可查看我下一篇博客,for嵌套setTimeout
我的理解
首先闭包是一个函数的作用域,也就是该函数能访问到所有的变量以及其他函数。
其次可以以闭包的方式,让函数调用已经不在的作用域。
下面放几个例子:
1 | var outer="outer"; |
console.log(magic)出现undefined的原因是未定义变量
外围作用域的所有变量都包含在了闭包中,哪怕它们的声明出现在现在函数声明之后。
1 | function makeAdder(x) { |
在这个示例中,我们定义了 makeAdder(x) 函数,它接受一个参数 x ,并返回一个新的函数。返回的函数接受一个参数 y,并返回x+y的值。
从本质上讲,makeAdder 是一个函数工厂 — 他创建了将指定的值和它的参数相加求和的函数。在上面的示例中,我们使用函数工厂创建了两个新函数 — 一个将其参数和 5 求和,另一个和 10 求和。
add5 和 add10 都是闭包。它们共享相同的函数定义,但是保存了不同的词法环境。