스코프란

참조 대상 식별자(identifier, 변수, 함수의 이름과 같이 어떤 대상을 다른 대상과 구분하여 식별할 수 있는 유일한 이름)를 찾아내기 위한 규칙이다. 자바스크립트는 이 규칙대로 식별자를 찾는다.

자바스크립트 스코프의 특징

블록 레벨 스코프(block-level scope): {} 코드블럭에서만 유효

함수 레벨 스코프(function-level scope) : 함수에서만 유효

ex)

var x = 0;
{
  var x = 1;
  console.log(x); // 1
}
console.log(x);   // 1

// 위의 var 함수는 함수객체에서만 유효가 되는 기능이므로 코드블록에서 사용하면 전역에서 유효하다

let y = 0;
{
  let y = 1;
  console.log(y); // 1
}
console.log(y);   // 0

전역스코프

전역에 변수를 선언하면 이 변수는 어디서든지 참조할 수 있는 전역 스코프를 갖는 전역 변수가 된다. var 키워드로 선언한 전역 변수는 전역 객체(Global Object) window의 프로퍼티이다.

함수 내에 존재하는 함수인 내부 함수

(중첩 스코프는 가장 인접한 지역을 우선하여 참조한다.)

var x = 'global';

function foo() {
  var x = 'local';
  console.log(x);

  function bar() {  // 내부함수
    console.log(x); // ?  
  }

  bar();
}
foo();
console.log(x); // ?