스코프에 대해서 공부하였고, 제대로 이해했는지 확인하기 위해 checkpoint 문제를 풀어보았다.
//Q.1
let x = 30;
function get () {
return x; //전역변수 x에서 가져온다. 함수 스코프 내에서 x를 별도로 선언하지 않음.
}
let result = get(20); //30. 여기서 20을 인자로 받아 함수에 전달해주었지만 get함수 내부의 어떤 변수에도 할당되지 않음.
// Q.2
let x = 30;
function get (x) { //매개변수 x가 선언되어 있다.
return x;//여기서 x는 전역변수 x가 아니라, get함수내의 스코프에 선언된 매개변수 x. 함수 스코프로 x=20을 선언한 것.
}
let result = get(20); //20
//Q.3
let x = 30;
function get () { return x; } //바깥 스코프에 접근하여 30을 가져온다.
function set (value) { let x = value; }
set(10); //value = 10, let x = 10이지만 함수스코프이다. 전역변수 x에 영향을 주지 않는다.
let result = get(20); //30
//Q.4
let x = 30; //set(10)함수 실행으로 인해 x에 10이 재할당된다.
function get () { return x; } //여기서 x는 전역변수 x이다.
function set (value) { x = value; }
set(10); //get함수내의 x에 아무것도 선언하지 않았으니 전역변수 x를 그대로 사용하겠다는 뜻.
let result = get(20); //10
//Q.5
let x = 30; //set(10)함수가 실행되면서 x = 10으로 재할당됨.
function get (x) { return x; }
function set (value) { x = value; } //x에 아무 키워드도 적지않음 -> 전역변수를 그대로 사용하겠다는 뜻.
set(10);
let result = get(20); //20: 함수스코프 내에 x = 20이 선언되었으므로 variable shadowing으로 인해 지역변수 x가 전역변수 x보다 우선순위가 높으므로 20출력
// Q.6
let x = 10;
function add (y) {
return x + y; //여기서 x는 전역변수 x = 10이다.
}
function strangeAdd (x) {
return add(x) + add(x);
}
let result = strangeAdd(5); //add(5) + add(5)
//add(5) === 10(전역변수 x의 값) + 5(매개변수 y의 값)
//15+15 === 30
//Q.7
let x = 10;
function outer () {
let x = 20;
function inner () {
return x; //스코프가 위계적으로 겹칠경우, 안쪽 스코프부터 바깥스코프로 순차적인 '스코프 체이닝'이 일어난다.
} //따라서, 바로 바깥 스코프인 outer함수에서의 x값을 가져온다.
return inner(); //20
}
let result = outer(); //20
위 경우처럼, 스코프가 위계적으로 겹칠경우 안쪽 스코프부터 바깥스코프로 순차적인 '스코프 체이닝'이 일어난다.
//Q.8
let x = 10;
function outer () {
let x = 20; //inner함수실행으로 x=30이 재할당된다.
function inner () {
x = x + 10; // x = 20+10. 즉 x=30. 바로 바깥 스코프인 outer함수스코프의 x변수에 재할당된다.
return x;
}
inner();
}
outer();
let result = x; //전역변수 x를 가져온다. 10
//Q.9
let x = 10; //2.outer함수에 의해 x = 20으로 재할당됨.
function outer () {
x = 20; //1. x에 아무런 키워드를 적지않았으므로 전역변수 x의 값이고, 재할당을 하고있다.
function inner () {
let x
x = x + 20; //x+20에서 x는 전역변수이므로 20. x = 40.
return x; //inner함수내에 x를 선언했으므로 이 x값은 inner함수내에서만 유효한 지역변수이다.
}
inner(); //40
}
outer();
let result = x; //전역변수 x이므로 20
//Q.10
let x = 10; //2.outer함수로 인해 x=20 재할당. 4.inner함수로 인해 x=40으로 재할당
function outer () {
x = 20; //1. 아무런 키워드가 없으므로 전역변수 x를 뜻하고, 재할당.
function inner () {
x = x + 20; //3.x+20에서 x는 전역변수. x=20+20. x에 아무런 키워드가 없으므로 x는 전역변수를 뜻한다.
}
inner();
}
outer();
let result = x; //전역변수 x === 40
**문제의 출처는 '코드스테이츠'입니다.
'JavaScript' 카테고리의 다른 글
유사배열객체(array-like object) (0) | 2023.04.19 |
---|---|
변수의 정의, 변수 호이스팅, var / let / const의 특징 (0) | 2023.02.13 |
SPA란? (0) | 2022.02.21 |
part3 (0) | 2021.09.21 |
fetch() API (0) | 2021.09.21 |