티스토리 뷰





반응형

변수 숨김

{
    //외부블록
    let x = 'blue';
    console.log(x);
    {
        //내부 블록
        let x = 3;
        console.log(x);
    }
    console.log(x);
}

내부 블록의 x는 외부 블록에서 정의한 x와는 이름만 같을 뿐 다른 변수이므로 외부 스코프의 x를 숨기는 효과가 있습니다. 여기서 이해해야 할 중요한 점은, 실행 흐름이 내부 블록에 들어가 새 변수 x를 정의하는 순간, 두 변수가 모두 스코프안에 있다는 겁니다. 변수의 이름이 같으므로 외부 스코프에 있는 변수에 접근할 방법이 없습니다.

클로저

함수가 특정 스코프에 접근할 수 있도록 의도적으로 그 스코프에서 정의하는 경우

스코프를 함수 주변으로 좁히는 것.

let globalFunc; //정의되지 않은 전역 함수
{
  let blockVar = 'a'; 	//블록 스코프에 있는 변수
  globalFunc = function() {
     console.log(blockVar);
     }
}
globalFunc();  //'a'

이 함수는 스코프에서 빠져나왔음에도 불구하고 blockVar에 접근할 수 있습니다.

호이스팅

같은 스코프안에 있기만 하다면 선언되기전에 해당 변수를 미리 사용할 수 있는 것 

x;			//undefined
var x =3;	
x;			//3

프로그래밍을 해본 사람들이라면 위의 상황이 어이가 없을 것이다. 선언하기도 전에 사용하는데 에러가 뜨지 않았다. 그렇다 var라는 키워드를 사용하면 호이스팅이라는 기능 때문에 저런식이 가능한거다.

if(x !==3){
 console.log(y);
 var y = 5;
 if(y === 5){
  var x = 3;
 }
 console.log(y);
}
if(x === 3)
 console.log(y);

이런식의 말도 안되는 코드도 가능해진다. 그렇기에 생겨난게 let라는 키워드다. var를 사용하면 저런 혼란스러움만 생기니 앞으로 let을 사용하는게 바람직하다. 이렇게 하면 처음 나왔던 변수 숨김도 불가능해진다. 더 명확해지는 것이다. 그리고 var는 언젠가 없어질 것이다.

스트릭트 모드

ES5 문법에서는 var로 변수를 만들지 않으면 전역 변수로 무조건 만드는 기능(?)이 있었습니다. 그렇다면 수많은 문제가 생길 것이기에 스트릭트 모드를 도입했습니다. 스트릭트 모드에서는 암시적 전역변수를 허용하지 않습니다. 스트릭트 모드를 사용하려면 문자열 "use strict" 하나만으로 이루어진 행을 코드 맨 앞에 쓰면 됩니다. 전역 스코프에서 쓰면 전역으로 적용되고 블록안에서 쓰면 블록에서면 적용됩니다. 

스트릭트 모드는 대부분의 경우에 바람직하므로 스트릭트 모드를 권합니다.

 

 

 

 

 

반응형
댓글
반응형
최근에 달린 댓글
글 보관함
Total
Today
Yesterday
최근에 올라온 글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31