CodeStates / Scope (2)

WeWorship TV·2020년 8월 10일

Function Scope VS Block Scope

Block: 중괄호로 시작하고, 끝나는 단위

여기서 질문
Q. 콘솔에 출력되는 결과는?

for (let i = 0; i < 5; i++) {
  console.log(i);              // 여기는 어디까지 찍힐까?
}
console.log("Final i: ", i);   // 여기는 어디가 나올까?

정답은 직접 확인해보자!!

ReferenceError가 나올텐데, 그 이유는 block범위를 벗어나게 되면 변수를 사용할 수 없다.


  • var 키워드 VS let 키워드
  • 변수를 정의하는 또 다른 키워드 var
    • JavaScript는 기본적으로, 함수 단위로 자신만의 Scope를 가진다
      -> var 키워드(old way)
    • 그러나, Block 단위로 Scope를 구분했을 때에 예측하기 쉬운 코드를 작성할 수 있다
      -> let 키워드

그렇다면 여기서 질문
Q. 콘솔에 출력되는 결과는?

for (var i = 0; i < 5; i++) {
  console.log(i);              // 여기는 어디까지 찍힐까?
}
console.log("Final i: ", i);   // 여기는 어디가 나올까?

정답은 직접 확인해보자!!


왜냐면 하나의 Function Scope 내에서는 사용이 가능하기 때문에 Reference Error를 내지 않는다.


  • 개발자 콘솔로 확인하는 var 키워드와 let 키워드
    ( 변수를 정의하는 또 다른 키워드 var의 작동원리를 통해 Function Scope와 Block Scope가 무엇인지 알아본다)
function greetSomeone(firstName) {
  var time = 'night';
  if (time === 'night') {
    var greeting = 'Good Night';
  }
  
  return greeting + ' ' + firstName;
}

greetSomeone('Steve');
function greetSomeone(firstName) {
  let time = 'night';
  if (time === 'night') {
    let greeting = 'Good Night';
  }
  
  return greeting + ' ' + firstName;
}

greetSomeone('Steve');

const 키워드

  • 값이 변하지 않는 변수, 즉 상수를 정의할 때 사용하는 키워드 const
    • let 키워드와 동일하게 Block Scope를 따른다
    • 값을 재정의하려고 하면 TypeError를 발생한다


  • var를 사용한 재 선언시, 아무런 에러도 내지 않는다

전역 변수와 window 객체

  • 전역 범위를 대표하는 객체 window
  • Global Scope에서 선언된 함수, var 키워드를 이용해 선언된 변수는 window 객체와 연결
  • 전역 범위에 너무 많은 변수를 선언하지 않도록 주의

선언 없이 초기화된 전역 변수

  • 절대로 선언 키워드(var, let, const)없이 변수를 초기화하지 말자.

그러니 다음을 반드시 기억해야 된다.

  • let이 var보다 좋은 이유 중 하나는, 재선언을 방지해주기 때문이다.

  • scope는 변수 접근 규칙이다.

  • 변수를 접근할 수 없을 때 나는 에러는 ReferenceError이다.

  • var로 정의된 전역변수는 window 객체에 담긴다.

  • 변수 선언을 하지 않으면 어떤 scope든 전역변수가 되므로 위험하다.

profile
자 이제 시작이야 내 꿈을

0개의 댓글