스코프가 중첩되어 있을 때, 각 변수가 가리키는 값이 어떤게 헷갈릴 때는 아래 4가지 내용을 꼭 체크할 것!
1. 전역/지역 스코프 각각 확인하기
2. 전역/지역 스코프에서 선언된 변수 있는지 확인하기
3. 변수 접근 가능: 안쪽 스코프 --> 바깥 스코프
4. 변수 우선순위: 지역> 전역
let x = 30; //전역변수 x,
function get () {
return x; //지역에서 x 선언 안 됨.
}
let result = get(20); //x=30
result; // 30
let x = 30;
function get (x) {
return x; ////get함수에 매개변수 x가 선언되어 있음. 즉 get함수가 반환하는 x는 전역 스코프의 x가 아니라, get함수 스코프에 선언된 별도의 매개변수 x입니다.
}
let result = get(20);
result; // 20
let x = 30;
function get () { return x; } //지역에서 x 선언 안 됨.
function set (value) { let x = value; } // 지역에서 x 선언 됨.
set(10); //set함수를 호출해도 그 안에서 별도로 지역x가 선언되어져 있으므로 전역 x에 영향이 없음.
let result = get(20); // get에서 x는 별도 선언 안 되어 있어서 전역x를 따름
result; //30
let x = 30;
function get () { return x; } //지역에서 x선언 안 됨.
function set (value) { x = value; }//지역에서 x선언 안 됨.
set(10); //전역 x에 영향 있음. x=10 할당 됨.
let result = get(20); //get에서 x는 별도 선언 안 되어 있어서 전역x를 따름
result; //10
let x = 10;
function outer () { //지역에서 x선언 됨.
let x = 20;
function inner () {//지역에서 x선언 안 됨. 바깥 지역의 x를 따름.
return x;
}
return inner();
}
let result = outer();
result; //outer의 리턴값이므로 20
let x = 10;
function outer () { //지역에서 x 선언 됨.
let x = 20;
function inner () { //지역에서 x선언 안 됨. 바깥 x를 따름
x = x + 10;
return x;
}
inner();
}
outer();
let result = x; //outer함수를 호출해도 그 안에서 별도로 지역x가 선언되어져 있으므로 전역 x에 영향이 없음. 따라서 10 출력
let x = 10;
function outer () { //x선언 안 됨. 전역x를 따름.
x = 20;
function inner () {//x선언 됨. 전역 x에 영향 없음
let x
x = x + 20; //x는 undefined인 상태에서 숫자 20과 더했으므로 x+20을 하면 NaN
return x; //NaN
}
inner();
}
outer();
let result = x; // 20
let x = 10;
function outer () {//x선언 안 됨. 전역x에 영향 있음.
x = 20;
function inner () {//x선언 안 됨. 전역x에 영향 있음.
x = x + 20;
}
inner();
}
outer();
let result = x; //40