본문 바로가기

JavaScript

스코프 checkpoint 문제

스코프에 대해서 공부하였고, 제대로 이해했는지 확인하기 위해 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