문제 1
콘솔에 찍힐 b 값을 예상해보고, 어디에서 선언된 "b"가 몇번째 라인에서 호출한 consol.log에 찍혔는지,
왜 그런지 설명해보세요.
주석을 풀어보고 오류가 난다면 왜 오류가 나는 지 설명하고 오류를 수정해보세요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
let b = 1;
function hi () {
const a = 1;
let b = 100;
b++;
console.log(a,b);
}
//console.log(a);
console.log(b);
hi();
console.log(b);
|
cs |
코드의 실행 결과는 총 3줄이며 아래와 같은 순서로 출력된다.
1
1, 101
1
첫번째 줄은 코드의 17번째 줄에 있는 consol.log(b)의 결과다.
여기서 b는 코드 1번째 줄의 선언에 따른 결과이고,
이는 마지막 출력 결과인 코드 21번째 줄 consol.log(b)와 완전히 동일하게 동작하는 코드이다.
결과로 출력된 2번째 줄 "1, 101"은 코드 19번째 줄 'hi()'에 의해 반환된 값이다.
코드 3번째 줄 function hi ()을 한줄씩 들여다 보면,
먼저 const a = 1; 이라는 명령으로 변수 a에 1이라는 값이 선언 및 할당 되었다.
그리고 let b = 100; 이라는 명령으로 변서 b에 100이라는 값이 선언 및 할당 되었다.
마지막으로 b++; 이라는 명령으로 b에 할당된 값에 1을 더해주었다.
그렇게 a와 b를 각각 호출하여 출력해주는
consol.log(a,b); 명령의 결과는
1, 101 이 되는 것이다.
코드에서 주석을 풀게되면 다음과 같은 에러 메시지를 띄운다.
변수 a는 정의 되지 않았다는 뜻인데, 이유는 다음과 같다.
위 코드에서 변수 a는 hi()함수의 코드블록 안에서 const 명령으로 선언 되었다.
let, const 키워드로 선언한 변수는 모두 코드 블록(ex. 함수, if, for, while, try/catch 문 등)을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다. 여기서 스코프란 식별자(ex. 변수명, 함수명, 클래스명 등)의 유효범위를 뜻하며, 선언된 위치에 따라 유효 범위가 달라진다. 전역에 선언된 변수는 전역 스코프를, 지역에 선언된 변수는 지역 스코프를 갖는다.
hi() 함수의 코드블록 안에서 'const' 키워드로 선언 및 할당된 a라는 변수는 지역변수로서 전역에서 a를 참조할 수 없기에
참조 에러가 뜨게되는 것이다.
따라서 블록레벨 스코프를 따르지 않는 'var'키워드르 사용하여 전역변수로서 선언 및 할당하게 되면 오류를 해결할 수 있다.
이때 주의할점은 'var'키워드로 선언된 변수는 함수레벨 스코프를 따르게 되므로 함수 내에서 선언시 전역변수가 아니게 되므로, 함수 밖에서 선언하여야 전역 변수로 쓰일 수 있다.
이를 적용한 코드는 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
let b = 1;
var a = 1;
function hi () {
let b = 100;
b++;
console.log(a,b);
}
console.log(a);
console.log(b);
hi();
console.log(b);
|
cs |
결과 :
1
1
1 101
1
hi()함수 내부에서 변수a의 선언이나 할당 없이도 참조할 수 있도록 함수 선언 이전에 var키워드를 통해 변수 a가 1이라는 값이 할당된 전역변수로 선언 되었고, 그 결과 오류 없이 참조하여 출력할 수 있게 되었다.
참고 : https://www.howdy-mj.me/javascript/var-let-const/
문제 2
두 값이 다른 이유를 설명하시오.

== 연산자 : 유형변환 비교를 지원하며 '값'이 같은지 확인.
=== 연산자 : 엄격한 비교. 유형변환을 지원하지 않기에 타입이 다르면 false를 반환한다.
숫자형 자료 1과 문자형 자료 "1"을 비교할 때 == 연산자의 경우 비교대상의 타입이 다르기 때문에 알아서 유형변환을 하여 '값'을 비교해준다.
하지만 ===연산자의 경우 유형변환을 지원하지 않는 엄격한 비교 연산자 이기 때문에 값이 같더라도 타입이 다르면 두 비교대상은 다르다는 결과를 반환한다.