Skip to content

Commit fb614ec

Browse files
committed
Quartz sync: Jun 9, 2025, 4:31 PM
1 parent 840cb19 commit fb614ec

File tree

15 files changed

+537
-179
lines changed

15 files changed

+537
-179
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
---
2+
description:
3+
aliases:
4+
created: 2025-06-09
5+
modified: 2025-06-09
6+
---
7+
8+
- 클로저가 변수를 캡처하는 방식 때문에 생기는 예상치 못한 동작
9+
-
10+
```js
11+
for (var i=0; i<10; ++i) {
12+
setTimeout(function() {
13+
console.log(i); // 10, 10, 10, 10, 10, 10 ...
14+
}, 1000);
15+
}
16+
```
17+
- `var`로 선언된 `i`는 함수 스코프 변수이고, setTimeout 콜백은 루프가 끝난 후에 실행되므로, 모든 클로저가 같은 i를 참조하게 됨
18+
- solutions
19+
-
20+
```js
21+
// using IIFE (immediately invoked function)
22+
// with delay
23+
for (var i=0; i<10; ++i) {
24+
(function(j) {
25+
setTimeout(function() {
26+
console.log(j);
27+
}, 1000);
28+
})(i);
29+
}
30+
31+
// without delay
32+
for (var i=0; i<10; ++i) {
33+
setTimeout((function(i) {
34+
console.log(i);
35+
})(i), 1000)
36+
}
37+
38+
39+
// wrap in a function
40+
for (var i = 0; i < 10; i++) {
41+
function timer(j) {
42+
setTimeout(function() {
43+
console.log(j);
44+
}, j);
45+
};
46+
timer(i);
47+
}
48+
49+
50+
// ES6, use let instead of var
51+
for (let i=0; i<10; ++i) {
52+
setTimeout(function() {
53+
console.log(i);
54+
}, 1000);
55+
}
56+
```
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
---
2+
description:
3+
created: 2025-05-18
4+
modified: 2025-06-09
5+
aliases:
6+
- 클로저
7+
---
8+
9+
- [Closures](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures)
10+
- is the combination of a function bundled together (enclosed) with references to its surrounding state (the lexical environment).
11+
- gives a function access to its outer scope. In JavaScript, closures are created every time a function is created, at function creation time.
12+
- 함수가 선언될 때의 렉시컬 스코프 안의 참조를 기억
13+
- 함수가 실행될 때, 렉시컬 스코프 안의 변수들에 접근할 수 있다
14+
- 값이 아닌 접근할 수 있는 연결(참조)를 유지
15+
- 함수 내부에 있는 함수가 외부 변수에 접근할 수 있는 건 클로저
16+
-
17+
```js
18+
function outer() {
19+
let count = 0;
20+
21+
function inner() { // closures
22+
count++;
23+
console.log(count);
24+
}
25+
26+
return inner;
27+
}
28+
29+
const fn = outer(); // outer는 실행되고 종료됨
30+
fn(); // 1
31+
fn(); // 2
32+
```
33+
- 열린 변수를 닫힌 변수로
34+
- lambda calculus
35+
- free variables
36+
- 내부에서 정의되지 않고, 외부에서 참조되는 변수
37+
- 외부에서 정의된 변수
38+
- closed lambda expression
39+
- free variables가 없는 람다 표현식
40+
- open lambda expression
41+
- free variables가 하나 이상 있는 람다 표현식
42+
- 람다 표현식 내에서 참조되는 외부 정의 변수가 있으면
43+
- Bound Variables (akaDependent, Restricted Variables)
44+
- 클로저에 의해 묶여진 자유 변수
45+
- 클로저가 활성 상태인 동안에는 가비지 컬렉터의 대상에서 제외
46+
- 해당 변수가 참조되고 있으니까
47+
- precautions
48+
- 메모리 누수 가능성
49+
- 코드의 복잡성
50+
- 이해의 어려움
51+
- 디버깅 어려움
52+
- use cases
53+
- key points
54+
- encapsulation
55+
- data hiding
56+
- state persistence
57+
- examples
58+
- currying
59+
- 여러 인자를 받는 함수를 단일 인자를 받는 함수로 변환
60+
- 함수의 부분 실행, 지연 실행 가능하게
61+
- 함수의 재사용성, 모듈성 향상
62+
-
63+
```js
64+
function createLogger (type) {
65+
return function (message) {
66+
console.log (`[${type}] ${message}`); // 파라미터도 외부 변수이니 묶인 변수됨
67+
}
68+
}
69+
const errorLogger = createLogger ( 'ERROR');
70+
const infoLogger = createLogger ( 'INFO');
71+
const warningLogger = createLogger ('WARNING');
72+
errorLogger("something");
73+
infoLogger("something");
74+
warningLogger("something");
75+
```
76+
- deferred execution
77+
- 지연 실행
78+
- 모든 함수의 인자가 등록되어야 실행
79+
-
80+
```js
81+
function add(a) {
82+
return function (b) {
83+
return function (c) {
84+
return a + b + c;
85+
}
86+
}
87+
}
88+
console. log (add (1) (2)); // not yet
89+
console. log (add (1) (2) (3)); // 6
90+
```
91+
- 리덕스 미들웨어의 구조
92+
- `const middleware = store => next => action => {}`
93+
- react
94+
- 함수형 컴포넌트는 자체적으로 상태 저장안되는데 어떻게?
95+
- (*현재는 클로저 아님*)
96+
- 함수 컴포넌트는 상태가 변경될 때마다 새로운 인스턴스를 생성하기 때문에 초기화된 상태만을 가질 수 있었다
97+
- `hook`을 통해 상태 보존
98+
- `useState` 간단히 구현해보기
99+
-
100+
```js
101+
function createUseState() {
102+
let state;
103+
104+
function setState(newState) {
105+
state = newState;
106+
render();
107+
}
108+
109+
function useState(initialState) {
110+
state = state === undefined ? initialState : state;
111+
return [state, setStatel;
112+
}
113+
114+
return useState;
115+
}
116+
```
117+
- `useEffect`의 [[Closure Trap]]
118+
- useEffect hook은 사이드 이펙트 처리용
119+
- 의존성 배열의 값 변화에 따라 콜백함수 실행
120+
- 필요할때 사이드 이펙트 실행
121+
- 콜백 함수
122+
- (컴포넌트의 렌더링 시점의) 상태와, 프롭을 기억
123+
- 클로져 특성 (초기 상태 캡처)
124+
- 그러므로 새로운 상태일때는 업데이트 해야함
125+
- 의존성 배열
126+
- [[Closure Trap | 클로저 트랩]]을 피하기 위해
127+
- useEffect의 콜백 함수가 의존해야하는 변수들
128+
- 의존 변수들 상태가 변할 때마다, 콜백 함수가 다시 실행(생성)
129+
- 콜백 함수는 최신 상태 기억하게 된다
130+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
---
2+
description:
3+
aliases:
4+
- 실행 컨텍스트
5+
created: 2025-06-09
6+
modified: 2025-06-09
7+
---
8+
9+
- Execution Context
10+
- 코드가 실행되는 환경을 말함
11+
- 어떤 변수, 함수에 접근 가능한지를 결정
12+
- 구성 요소
13+
- `Variable Environment`
14+
- `var`, 함수 선언 등
15+
- lexical environment과 겹쳐보이지만, 초기화용
16+
- `This Binding`
17+
- `this`가 참조하는 값
18+
- `Scope Chain`
19+
- `Lexical Environment`
20+
- Activation Object
21+
- 특정 스코프의 변수와 함수 선언을 저장하는 객체
22+
- 구성 요소
23+
- `Environment record`
24+
- 내부 지역 변수, 참조
25+
- `Outer Lexical Environment Reference`
26+
- 전역 환경, 부모 스코프의 lexical environment 를 참조
27+
- [[Closures]]의 원리
28+
- 종류
29+
- Global Context
30+
- 전체 코드 실행 시 생성
31+
- browser - `window`
32+
- node - `global`
33+
- Function Context
34+
- 함수 호출마다 생성
35+
- Eval Context
36+
- `eval()` 실행 시 생성
37+
- 실행 과정
38+
- 컨텍스트 생성
39+
- 변수/함수 선언을 메모리에 올림 (호이스팅)
40+
- 컨텍스트 실행
41+
- 코드 실행
42+
- 함수 호출 시 새로운 컨텍스트가 스택에 push됨

content/Computer Science/5 Software Development/Programming Language/JavaScript/JS.md

Lines changed: 0 additions & 133 deletions
This file was deleted.

0 commit comments

Comments
 (0)