11
22# 변수의 유효범위와 클로저
33
4- 자바스크립트는 함수 지향 언어입니다. 이런 특징은 개발자에게 많은 자유도를 줍니다. 함수를 동적으로 생성할 수 있고, 생성한 함수를 다른 함수에 인수로 넘길 수 있으며, 생성된 곳이 아닌 곳에서 함수를 호출할 수도 있기 때문입니다.
4+ 자바스크립트는 함수 지향 언어입니다. 이런 특징은 개발자에게 많은 자유를 줍니다. 함수를 동적으로 생성할 수 있고, 생성한 함수를 다른 함수에 인수로 넘길 수 있으며, 생성된 곳이 아닌 곳에서 함수를 호출할 수도 있기 때문입니다.
55
66함수 내부에서 함수 외부에 있는 변수에 접근할 수 있다는 사실은 앞서 학습해서 알고 계실 겁니다.
77
1414```smart header="여기선 ` let ` , ` const ` 로 선언한 변수만 다룹니다."
1515자바스크립트에서는 3개의 키워드를 사용해 변수를 선언할 수 있습니다. 모던한 방식인 ` let ` , ` const ` 가 있고, 과거의 잔재인 ` var ` 도 있습니다.
1616
17- - 이번 주제의 모든 예시에선 ` let ` 변수를 사용할 예정입니다.
17+ - 이번 주제의 모든 예시에선 ` let ` 으로 선언한 변수를 사용할 예정입니다.
1818- ` const ` 로 선언한 변수 역시 ` let ` 변수와 동일하게 동작합니다. 따라서 예시의 ` let ` 을 ` const ` 로 바꿔도 동일한 동작을 기대할 수 있습니다.
1919- ` var ` 는 ` let ` 과 ` const ` 로 선언한 변수와 몇 가지 중요한 차이가 있습니다. 자세한 내용은 < info:var > 에서 다루겠습니다.
2020```
2727
2828```js run
2929{
30- // 지역 변수에 몇 가지 조작을 하면, 그 결과를 밖에선 볼 수 없습니다.
30+ // 지역 변수를 선언하고 몇 가지 조작을 했지만 그 결과를 밖에서 볼 수 없습니다.
3131
32- let message = "Hello "; // 블록 내에서만 변숫값을 얻을 수 있습니다.
32+ let message = "안녕하세요. "; // 블록 내에서만 변숫값을 얻을 수 있습니다.
3333
34- alert(message); // Hello
34+ alert(message); // 안녕하세요.
3535}
3636
3737alert(message); // ReferenceError: message is not defined
3838```
3939
40- 이런 특징은 고유한 작업을 수행하는 코드를 한데 묶는 용도로 활용할 수 있습니다. 이 블록 안엔 해당 작업을 수행하기 위해 사용된 변수가 들어갑니다.
40+ 이런 블록의 특징은 특정 작업을 수행하는 코드를 한데 묶어두는 용도로 활용할 수 있습니다. 블록 안엔 작업 수행에만 필요한 변수가 들어갑니다.
4141
4242``` js run
4343{
@@ -53,7 +53,7 @@ alert(message); // ReferenceError: message is not defined
5353}
5454```
5555
56- ```` smart header="블록이 없으면 에러가 발생할 수 있습니다 ."
56+ ```` smart header="블록이 없으면 에러가 발생합니다 ."
5757이미 선언된 변수와 동일한 이름을 가진 변수를 별도의 블록 없이 `let`으로 선언하면 에러가 발생합니다.
5858
5959```js run
@@ -81,9 +81,9 @@ if (true) {
8181alert (phrase); // ReferenceError: phrase is not defined
8282```
8383
84- ` if ` 블록 아래에 있는 ` alert ` 에선 ` phrase ` 에 접근할 수 없기 때문에 위 예시를 실행하면 에러가 발생합니다.
84+ ` if ` 블록 밖에 있는 ` alert ` 는 ` phrase ` 에 접근할 수 없기 때문에 위 예시를 실행하면 에러가 발생합니다.
8585
86- 이런 특징은 변수의 범위를 블록 범위, 특히 ` if ` 분기문 범위로 한정시킬 수 있어서 아주 유용합니다.
86+ 이런 특징은 변수의 유효 범위를 블록 범위, 특히 ` if ` 분기문 범위로 한정시킬 수 있어서 아주 유용합니다.
8787
8888` if ` 뿐만 아니라 ` for ` , ` while ` 반복문에서도 동일한 특징이 적용됩니다.
8989
@@ -96,13 +96,13 @@ for (let i = 0; i < 3; i++) {
9696alert (i); // ReferenceError: i is not defined
9797```
9898
99- ` let i ` 는 ` {...} ` 밖에 있긴 하지만 ` for ` 옆 괄호 안에서 선언한 변수는 블록 ` {...} ` 에 속하는 코드로 취급된다는 점에서 조금 특별합니다 .
99+ 참고로 ` for ` 문에서 ` for ` 옆 괄호 안에서 선언한 변수(예시에서 ` let i ` ) 는 ` {...} ` 밖에 있긴 하지만 블록 ` {...} ` 에 속하는 코드로 취급됩니다 .
100100
101101## 중첩 함수
102102
103103함수 내부에서 선언한 함수는 '중첩(nested)' 함수라고 부릅니다.
104104
105- 자바스크립트에선 중첩 함수를 손쉽게 만들 수 있습니다.
105+ 자바스크립트에선 손쉽게 중첩 함수를 만들 수 있습니다.
106106
107107중첩 함수는 아래와 같이 코드를 정돈하는데 사용할 수 있습니다.
108108
@@ -122,9 +122,9 @@ function sayHiBye(firstName, lastName) {
122122
123123위 예시에서 외부 변수에 접근해 이름 전체를 반환해주는 * 중첩* 함수 ` getFullName() ` 은 편의상 만든 함수입니다. 이렇게 자바스크립트에선 중첩 함수가 흔히 사용됩니다.
124124
125- 중첩 함수는 반환될 수 있다는 점에서 흥미롭습니다. 새로운 객체의 프로퍼티 형태로나 중첩 함수 그 자체로 반환되죠 . 이렇게 반환된 함수는 어디서든 호출해 사용할 수 있습니다. 물론 이때도 외부 변수에 접근할 수 있다는 사실은 변함없습니다.
125+ 중첩 함수는 새로운 객체의 프로퍼티 형태나 중첩 함수 그 자체로 반환될 수 있다는 점에서 흥미롭습니다 . 이렇게 반환된 중첩 함수는 어디서든 호출해 사용할 수 있습니다. 물론 이때도 외부 변수에 접근할 수 있다는 사실은 변함없습니다.
126126
127- 아래 함수 ` makeCounter ` 는 숫자를 세주는 '카운터' 함수를 만듭니다. 카운터 함수는 호출될 때마다 다음 숫자를 반환합니다 .
127+ 아래 함수 ` makeCounter ` 는 호출될 때마다 다음 숫자를 반환해주는 '카운터' 함수를 만듭니다.
128128
129129``` js run
130130function makeCounter () {
0 commit comments