闭包其实很粗略

哎呀是闭包

闭包是函数式编程基石,在款式上虽是一个函数内部定义另一个函数,函数的库在以函数返回后连无自由,我们为得以领略为这些函数堆栈并无在栈上分配而是在积上分红。

看罢概念是未是一头雾水?没关系,我从来不欣赏以概念上理解技术,直接看闭包能缓解什么问题。本文采用JS代码辅助理解,虽然JS是同等山头设计糟糕、备受吐槽的语言,但是JS的闭包特性是90年间后所有语言里最好的。

用途

  1. 拜权限控制

面向对象语言如Java、C++都见面发出private、public关键字,不容许从类外部直接看特定成员变量,需要经成员函数来拜会,这是一个深普遍、很有理的需。
优先复习一下JS的变量作用域。
函数内部可以拜全局变量:

var n=1;
function print(){
     console.log(n);
};
print(); // 1

唯独自函数外部不可知顾函数内部变量:

function fun() {
     var a = 0; 
};
console.log(a); // error

于是乎闭包派上用场了:

function outer() {
     var n = 2;
     function inner() {
       return n; 
     };
     return inner();
}
var result = outer();
console.log(result); // 2
  1. 延变量生命周期

当面向对象语言里,函数内之变量都是于栈上分配的,函数调用完成后,栈销毁,变量的生命周期结束。而目标是在积分配的,会常驻内存,除非叫手动或自行回收掉。
闭包再次救场:

function createCounter() {
     var counter = 0;
     function increment() {
       counter = counter + 1;
       console.log("Number of events: " + counter);
     }
     return increment;
}
var incr = createCounter();
incr(); // 1
incr(); // 2
incr(); // 3

函数式编程

临几年,老古董函数式编程大有卷土又来、取代面向对象的主旋律,我有史以来认为相同家新技巧使说明自己牛逼,最好的政策不是失去炫技,因为不少看客好奇心不愈、学习能力一般,很轻就叫吓跑了。毕竟技术是来缓解问题之,下面我分别用Java和JS实现一个能自增自减的主次,看看彼此有甚区别。
Java:

public class Counter {

    private int counter;

    public Counter() {
        counter = 0;
    }

    public int getCounter() {
        return counter;
    }

    public void incr() {
        ++counter;
    }

    public void decr() {
        --counter;
    }

    public static void main(String[] args) {
        Counter counter = new Counter();
        counter.incr();
        counter.incr();
        counter.decr();
        System.out.println(counter.getCounter()); // 1
    }
}

JS:

function Counter() {
  var counter = 0;
  function incr() {
    ++counter; 
  }
  function decr() {
    --counter; 
  }
  function getCounter() {
    return counter; 
  }
  return {
    incr: incr,
    decr: decr,
    getCounter: getCounter
  }
}
var counter = Counter();
counter.incr();
counter.incr();
counter.decr();
console.log(counter.getCounter()); // 1

脱函数式编程天生的自大,排除外界的侵扰,还原它的庐山真面目。至于面向函数和面向对象哪个好,不是三言两语能说了解的,待我随后更重。

相关文章