# 解密JavaScript闭包

### 计数器

```increment(); // Number of events: 1
increment(); // Number of events: 2
increment(); // Number of events: 3```

```var counter = 0;

function increment() {
counter = counter + 1;
console.log("Number of events: " + counter);
}```

### 多个计数器

```var counter1 = 0;

function incrementCounter1() {
counter1 = counter1 + 1;
console.log("Number of events: " + counter1);
}

var counter2 = 0;

function incrementCounter2() {
counter2 = counter2 + 1;
console.log("Number of events: " + counter2);
}

incrementCounter1(); // Number of events: 1
incrementCounter2(); // Number of events: 1
incrementCounter1(); // Number of events: 2```

### 使用闭包实现计数器

```function createCounter() {
var counter = 0;

function increment() {
counter = counter + 1;
console.log("Number of events: " + counter);
}

return increment;
}

var counter1 = createCounter();
var counter2 = createCounter();

counter1(); // Number of events: 1
counter1(); // Number of events: 2
counter2(); // Number of events: 1
counter1(); // Number of events: 3```

• 创建了一个局部变量counter
• 创建了一个局部函数increment()，它可以对counter变量进行加 1操作。
• 将局部函数increment()返回。注意，返回的是函数本身，而不是函数调用的结果。

```// fancyNewCounter是一个新创建的函数
var fancyNewCounter = createCounter();```

```// 每个计数器都会从1开始计数
var counter1 = createCounter();
counter1(); // Number of events: 1
counter1(); // Number of events: 2

// 第1个计数器不会影响第2个计数器
var counter2 = createCounter();
counter2(); // Number of events: 1

// 第2个计数器不会影响第1个计数器
counter1(); // Number of events: 3```

### 为计数器命名

```var catCounter = createCounter("cats");
var dogCounter = createCounter("dogs");

catCounter(); // Number of cats: 1
catCounter(); // Number of cats: 2
dogCounter(); // Number of dogs: 1```

```function createCounter(counterName) {
var counter = 0;

function increment() {
counter = counter + 1;
console.log("Number of " + counterName + ": " + counter);
}

return increment;
}```

### 优化计数器调用方式

```var dogCounter = createCounter("dogs");
dogCounter.increment(); // Number of dogs: 1```

```function createCounter(counterName) {
var counter = 0;

function increment() {
counter = counter + 1;
console.log("Number of " + counterName + ": " + counter);
}

return { increment: increment };
}```

### 添加 decrement 方法

```function createCounter(counterName) {
var counter = 0;

function increment() {
counter = counter + 1;
console.log("Number of " + counterName + ": " + counter);
}

function decrement() {
counter = counter - 1;
console.log("Number of " + counterName + ": " + counter);
}

return {
increment: increment,
decrement: decrement
};
}

var dogsCounter = createCounter("dogs");

dogsCounter.increment(); // Number of dogs: 1
dogsCounter.increment(); // Number of dogs: 2
dogsCounter.decrement(); // Number of dogs: 1```

### 添加私有方法

```function createCounter(counterName) {
var counter = 0;

function display() {
console.log("Number of " + counterName + ": " + counter);
}

function increment() {
counter = counter + 1;
display();
}

function decrement() {
counter = counter - 1;
display();
}

return {
increment: increment,
decrement: decrement
};
}

var dogsCounter = createCounter("dogs");

dogsCounter.increment(); // Number of dogs: 1
dogsCounter.increment(); // Number of dogs: 2
dogsCounter.decrement(); // Number of dogs: 1```

```var dogsCounter = createCounter("dogs");
dogsCounter.display(); // ERROR !!!```

0 条评论

• ### 彻底弄懂ES6中的Map和Set

Map对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。构造函数Map可以接受一个数组作为参数。

• ### webpack运行Babel教程

由于低版本的浏览器没有支持ES6语法，这就意味着代码会出错。例如，在IE 10浏览器中，会出现”语法错误”：

• ### webpack运行Babel教程

由于低版本的浏览器没有支持ES6语法，这就意味着代码会出错。例如，在IE 10浏览器中，会出现”语法错误”：

• ### 纯云开发获取用户微信绑定的手机号码

今天开始在写带支付版的二手书了，涉及到用户注册信息需要获取手机号，这里有两个办法，第一是购买短信接口，第二是直接小程序开放数据获取手机号。

• ### 星援被端，能否终结刷量时代？

刷量已成整个新媒体产业的顽疾，几乎所有内容平台都受到刷量困扰。刷量表面上给平台创造了数据的繁荣，但这样的虚假繁荣就是空中楼阁，刷量干扰用户体验，挤压优质账号，破...

进入nginx目录，执行git checkout release-1.13.9选定版本 进入ngx_http_google_filter_module目录，执...

• ### 手机199开头的号码的正则验证

以前的正则验证里面，如果是199开头或者166开头的手机号码就没有办法通过验证，会给这些用户带来一定的麻烦

Fundebug技术总监