石家庄海信电视维修售后
当前位置:主页 > www.059.com >

设计闭包(Closure)的初衷是为了解决什么问题?

来源:未知作者:admin发布:2016-10-15 07:24

Closure 是为了在实现 λ-calculus 时搞定作用域问题而搞出来的,详见Closure (computer programming) - Wikipedia, the free encyclopedia
λx.λ.y.x+y 可能实现为
function add(x) => {
    return (y)=>{ x+ y}
}
1+2可以这样表示:
let add1=add(1)
add1(2)

let add2=add(2)
add2(1)

这里的 add1、add2 都是 closure ,明显这俩都是 add 的某种“副本”,实现上需要有一块存储区域来记add1: x=1、add2: x=2 这个状态,这个状态对外不可见,所以叫它闭包还蛮形象的。

在现实的编程语言,往往将这个概念扩张一下:
function foo(){
    var a=0, b=0;
    return ()=>{a+b}
}

这种也称之为 closure,因为 a 和 b 的可见性确实封闭在 foo 函数范围之内了。这时候就跟 OOP 能扯到一起了,它提供了一个作用域,可以实现隐藏状态显露行为,正是 OOP 的核心理念。所以在 JavaScript 这类没有提供对象成员可见性控制的语言里,经常拿这个来模拟 OOP 的可见性。