# [LC JS30] Closure 閉包
## Day 1 Create Hello World Function
### 題目:
Write a function createHelloWorld. It should return a new function that always returns "Hello World".
### 解答:
```javascript
var createHelloWorld = function() {
return () => "Hello World"
};
```
* 一般函式基本觀念:
* 具名函式
* 匿名函式(Anonymous Function)
* 立即函式(Immidiately Invoked Function Expression)
* Functions within Functions
* 函式提升(Function Hoisting)
* You can only do this if you declare functions with the `function` syntax.
* Closure
* 箭頭函式
```javascript!
const f = (a, b) => {
const sum = a + b;
return sum;
};
console.log(f(3, 4)); // 7
```
### Closure 閉包
* When a function is created, it has access to a reference to all the variables declared around it, also known as it's lexical environment. The combination of the function and its enviroment is called a closure.
```javascript!
function createAdder(a) {
function f(b) {
const sum = a + b;
return sum;
}
return f;
}
const f = createAdder(3);
console.log(f(4)); // 7
```
## Day2 Counter
### 題目:
Given an integer n, return a counter function. This counter function initially returns n and then returns 1 more than the previous value every subsequent time it is called (n, n + 1, n + 2, etc).
```javascript!
/**
* const counter = createCounter(10)
* counter() // 10
* counter() // 11
* counter() // 12
*/
```
### 解答
```javascript
var createCounter = function(n) {
return () => n++;
};
```
#### ⭐知識點
* `createCounter(10)` 函式賦值到 `counter` 形成獨立的作用域,裡面的值 `n` 會重複累加
* `n++` 會先回傳值,再運算;`++n` 則會先運算再回傳值
* https://ithelp.ithome.com.tw/articles/10192800
#### 🐕自己寫的初版
```javascript
var createCounter = function(n) {
let count = 0
return () => {
count++
return count + n - 1
};
};
```
## Day3 CouterII
### 題目:
Write a function `createCounter`. It should accept an initial integer `init`. It should return an object with three functions.
The three functions are:
- `increment()` increases the current value by 1 and then returns it.
- `decrement()` reduces the current value by 1 and then returns it.
- `reset()` sets the current value to `init` and then returns it.
```javascript
const counter = createCounter(5)
counter.increment(); // 6
counter.reset(); // 5
counter.decrement(); // 4
```
### 解答:
```javascript
var createCounter = function(init) {
let num = init
return {
increment: () => ++num,
decrement: () => --num,
reset: () => num = init
}
};
```