let username = 'Dyract';
if (username) {let message = `Hello, ${username}!`;
console.log(message);// ?}console.log(message);// ?
출력 :
"Hello, Dyract!"
ReferenceError
4번째 줄에서 message를 출력할 때는 3번째 줄의 username을 바깥 스코프에서 가져왔으므로 정상적으로 출력한다.
6번째 줄에서는 message라는 변수 자체가 안쪽 스코프에 선언되어 있으므로 바깥쪽에서 접근할 수 없다.
let name = '김영희';
function showName() {
let name = '김철수';// 지역 변수
console.log(name);// 두 번째 출력
}
console.log(name);// 첫 번째 출력
showName();
console.log(name);// 세 번째 출력
출력 :
김영희
김철수
김영희
전역 변수 name과 function showName에 선언된 지역 변수 name은 서로 다른 변수이다.
let name = '김영희';
function showName() {name = '김철수';
console.log(name);// 두 번째 출력}console.log(name);// 첫 번째 출력showName();
console.log(name);// 세 번째 출력
출력 :
김철수
김영희
김영희
지역 스코프에서 새로 선언되지 않은 변수는 전역 변수와 같은 변수이다.
| let | const | var | |
|---|---|---|---|
| 유효 범위 | 블록 스코프 및 함수 스코프 | 블록 스코프 및 함수 스코프 | 함수 스코프 |
| 값 재할당 | 가능 | 불가능 | 가능 |
| 재선언 | 불가능 | 불가능 | 가능 |
'user strict';//문법적으로 실수할 수 있는 부분을 에러로 판단
finction showAge() {
age = 90;// 여기서 에러가 발생
console.log(age);//90
}
showAge();
클로저 : 함수와 함수가 선언된 어휘적(lexical) 환경의 조합. 환경은 클로저가 생성된 시점의 유효 범위 내에 있는 모든 지역변수로 구성됨.
클로저 함수 : 외부 함수의 변수에 접근할 수 있는 내부 함수
const adder = x => y => x + y;
adder(5)(7);//12
이와 같이 화살표를 두 번 사용한 함수를 기본 형태로 바꾸면 다음과 같다.
const adder = function(x) {
return function(y) {
return x + y;
}
}
함수에 의해 스코프가 구분된다.
: 외부 함수의 실행이 끝나더라도 외부 함수 내 변수를 사용할 수 있음
const adder = function(x) {
return function(y) {
return x + y;
}
}
const add5 = adder(5);
add5(7)//12
add5(10)//15
: 내부 함수를 단 하나만 리턴하는 것에 그치지 않고, 객체에 담아 여러 개의 내부 함수를 리턴하도록 만듦.
const makeCounter = () => {
let value = 0;
return {
increase: () => {
value = value + 1
},
decrease: () => {
value = value - 1
},
getValue: () => value
}
}
const counter1 = makeCounter();
counter1// { increase : f, decrease : f, getValue : f }, type: 객체
value라는 변수에 값을 새롭게 직접 할당할 수 없음. (지역변수)
=> 정보의 접근 제한(캡슐화), 의도치 않은 전역 변수 생성 방지
const counter1 = makeCounter();
const1.increase();
const1.increase();
const1.decrease();
const1.getValue();// 1const counter2 = makeCounter();
const2.decrease();
const2.decrease();
const2.decrease();
const2.getValue();// -3
counter1에서의 value와 counter2에서의 value는 각자 독립적.
=> 함수 재사용성 극대화, 함수 하나를 완전히 독립적인 부품 형태로 분리 (모듈화)