📗
TIL
  • About
  • javascript
    • GoodParts
      • 프로토타입 방식
      • RegexComponent
      • 재귀적 호출 (Recursive Call)
      • 객체를 기술하는 객체
      • 예외 (Exception)
      • 호출
      • 문자열 (Strings)
      • 참조 (Reference)
      • 배열의 특성들
      • 숫자 (Numbers)
      • 메모이제이션 (Memoization)
      • 모듈 (Module)
      • 열거 (Enumeration)
      • 정규 표현식
      • 정규 표현식 객체 생성
      • 프로토타입 (Prototype)
      • 콜백 (Callback)
      • 문장 (Statements)
      • 함수 표현식 요약
      • 의사 클래스 방식 (Pseudoclassical)
      • 함수를 사용한 방식
      • 클로저 (Closer)
      • 배열 (Array)
      • 기본 타입에 기능 추가
      • 자바스크립트 분석
      • 인수 배열(arguments)
      • Function
      • 유효범위(Scope)
    • YouDon'tKnowJS
      • 타입
      • Native
      • 명시적 강제변환
      • 문자열
      • 함수 vs 블록 스코프
      • 클로저
      • 배열
      • 숫자
      • 연산자 우선순위
      • 스코프
      • 암시적 강제변환
      • 래퍼
      • Statement
      • 호이스팅
      • Coercion
    • javascript
Powered by GitBook
On this page
  • 함수 기반 스코프
  • 블록 스코프

Was this helpful?

  1. javascript
  2. YouDon'tKnowJS

함수 vs 블록 스코프

스코프는 컨테이너 또는 바구니 역할을 하는 일종의 '버블'이고 변수나 함수같은 확인자가 그 안에서 선언된다

함수 기반 스코프

function foo(a) {
    var b = 2;
    // some code
    function bar() {
        // ...
    }    
    // more code
    var c = 3;
}

a, b, c, bar 모두 foo()의 스코프 버블에 속하므로 foo() 바깥에서는 이들에게 접근할 수 없다. 따라서 다음 코드는 호출된 확인자가 글로벌 스코프에는 없기 때문에 ReferenceError 오류를 발생시킨다

블록 스코프

블록 스코프의 목적은 변수를 최대한 사용처 가까이에서 최대한 작은 유효 범위를 갖도록 선언하기 위함이다

var foo = true;

if (foo) {
    var bar = foo * 2;
    bar = something(bar);
    console.log(bar);
}

위의 코드는 보기에만 스코프처럼 보이는 '가짜' 블록 스코프로 bar를 의도치 않게 다른 곳에서 사용하지 않도록 상기시키는 역할을 할 뿐이다

다행히도 ES6에서 새로운 키워드 let이 채택됐다.

```javascript 1.7 var foo = true;

if (foo) { { // <-- explicit block let bar = foo * 2; bar = something(bar); console.log(bar); } } console.log(bar); // ReferenceError

```

ES6에서는 키워드 let과 함께 const도 추가됐다. const 역시 블록 스코프를 생성하지만 선언된 값은 고정된다(상수)

Previous문자열Next클로저

Last updated 4 years ago

Was this helpful?