Closures (闭包) - Part 4 of 函数式编程
-
闭包是函数和声明该函数的词法环境的组合。
上面这段摘自Moz://a ,读起来有点拗口。通俗点说闭包是一种函数声称,它的特别之处是一个函数被包裹在其他函数(function)或者对象(object)里。
Javascript的词法环境(lexical environment )有点特殊:函数内部的变量(
️这里指加了var, let, 或者const,不然就变全局变量了)不可以被外部访问,但是可以在内部函数(即闭包)里被访问。这么一来,如果我们把闭包函数返回,赋给外部变量,这样外部不就可以访问函数内部的变量了吗?(大哥,有点聪明啊
)
来个例子看看:
function outterFun() { var name = "localVar"; return function innerFun() { return name; }; } var magicFun = outterFun(); console.log(name); //不能访问 console.log(magicFun()); // 用闭包就可以了
闭包基本实现了,面向对象语言里的private变量的功能,也就是说你可以把闭包看成是其父函数的public函数,父函数的变量只可以用public函数来改变。
再来个例子:var counter = (function() { var privateCounter = 0; function changeBy(val) { privateCounter += val; } return { increment: function() { changeBy(1); }, decrement: function() { changeBy(-1); }, value: function() { return privateCounter; } }; })(); console.log(counter.value()); // logs 0 counter.increment(); counter.increment(); console.log(counter.value()); // logs 2 counter.decrement(); console.log(counter.value()); // logs 1