13장. 스코프

Apeachicetea·2021년 10월 19일
0
post-thumbnail

13.1 스코프란?

모든 식별자(변수 이름, 함수 이름, 클래스 이름, 등)는 자신이 선언된 위치에 의해 다른 코드가 식별자 자신을 참조할 수 있는 유효 범위가 결정된다. 이를 스코프라 한다.
즉, 스코프는 식별자가 유효한 범위를 말한다.


13.2 스코프의 종류

전역에서 선언된 변수는 전역 스코프를 갖는 전역 변수이고, 지역에서 선언된 변수는 지역 스코프를 갖는 지역변 변수이다.

13.2.1 전역과 전역 스코프

  1. 전역이란, 코드의 가장 바깥 영역을 말한다.
  2. 전역은 전역 스코프를 만든다.
  3. 전역에 변수를 선언하면 전역 스코프를 갖는 전역 변수가 된다.
  4. 전역 변수는 어디든지 참조할 수 있다.

13.2.2 지역과 지역 스코프

  1. 지역이란, 함수 몸체 내부를 말한다.
  2. 지역은 지역 스코프를 만든다.
  3. 지역에 변수를 선언하면 지역 스코프를 갖는 지역 변수가 된다.
  4. 지역 변수자신의 지역 스코프와 하위 지역 스코프에서 유효하다.

13.3 스코프 체인

스포크가 계층적으로 연결된 것을 스코프 체인이라 한다.

변수를 참조할 때 자바스크립트 엔진은 스코프 체인을 통해 변수를 참조하는 코드의 스코프에서 시작하여 상위 스코프 방향으로 이동하며 선언된 변수를 검색한다.


13.4 함수 레벨 스코프

var키워드로 선언된 변수는 오로지 함수의 코드 블록(함수 몸체)만지역 스코프로 인정한다. 이러한 특성을 함수 레벨 스코프라 한다.


13.5 렉시컬 스코프

  1. 자바스크립트는 렉시컬 스코프를 따르므로 함수를 어디서 정의했는지에 따라 상위 스코프를 결정한다.
  2. 함수가 호출된 위치는 상위 스코프 결정에 어떠한 영향도 주지 않는다.
  3. 즉, 함수의 상위 스코프는 언제나 자신이 정의된 스코프다.

예시

 var x = 1;

  function foo() {
    var x= 10;
    bar();
  }

  function bar() {
    console.log(x);
  }

  foo(); // 1
  bar(); // 1

예제를 통한 개념 재확인!

문제 : case 1~5에 들어갈 값들은 무엇일까?!

Hint!
1. outertFn 함수 내에서 innerFn함수가 실행 되었다.
2. const innerFn = outerFn();outerFn함수가 실행되면서 변수 innerFn에 할당된 것이다.

  function () {
    let age = 27;
    let name = 'jin';
    let height = 179;

    function outerFn() {   
      let age = 24;                                        
      name = 'jimin';                                         
      let height = 178;                                 

      function innerFn() {
        age = 26;                
        let name = 'suga'; 
        return height;
      }

      innerFn(); 

      expect(age).to.equal();  //case.1
      expect(name).to.equal(); //case.2

      return innerFn;
    }

    const innerFn = outerFn();

    expect(age).to.equal(); //case.3
    expect(name).to.equal(); //case.4
    expect(innerFn()).to.equal(); //case.5
  };

해답!

case 4 해결 시 참고해야할 부분!

.png)

case 1 : 26
(outerFn함수 내 let age = 24;있지만, 문제 바로 위에서 innerFn가 실행되었다. innerFn 함수 내에는 변수 age를 26으로 재할당 해주고 있다. 따라서 26이다.)
case 2 : 'jimin'
(outerFn함수 내 전역변수 name을 재할당한 name = 'jimin'; 존재한다.)
case 3 : 27
(문제 앞에서 outerFn 함수를 실행했었지만, 전역변수 age에 영향을 줄 수 있는 innerFn함수가 실행된 것이 아니기 때문에 여전히 27이다.)
case 4 : 'jimin'
cast 5 : 178
(innerFn함수 실행 값은 height인데, 함수 내 height변수가 없으므로 상위 스코프인 outerFn함수 내에 있는 height값을 가지게 된다.)


profile
웹 프론트엔드 개발자

0개의 댓글