- 전역(global)변수를 만드는 일은 최대한 지양
-전역 변수란 자바스크립트에서 제일 바깥 범위(함수 안에 포함되지 않은)에 변수를 만드는 것
-window 객체에 변수를 만드는 것- 변수(var, let, const)로 선언을 해서 scope를 명확하게 해 주기
-함수 안에 var, let, const 없이 그냥 변수를 선언할 경우 함수 밖에서도 참조 가능
-사용할 변수를 되도록 함수 앞부분에 선언해두기
- 루트 객체
-모든 객체는 전역 객체라고도 하고 전역 변수 스코프라고도 한다
-웹 페이지 실행 환경에서는 window가 루트 객체 (this === window)
-함수 내부에서 선언한 변수는 지역 변수 / 외부에서 선언한 변수는 모두 전역 변수
-함수, if문, for문, while문, try/catch문 등 내에서만 유효
var x = 1; function foo() { var x = 10; bar(); } function bar() { console.log(x); } foo(); ----> 1 bar(); ----> 1
-> 1. 함수를 어디에서 호출했는가(동적 스코프 Dynamic scope) -- 함수 bar의 상위 스코프는 함수 foo와 전역
2. 함수를 어디에 선언하였는가(렉시컬 스코프) -- 함수 bar의 상위 스코프는 전역
- 전역 변수 대신 함수 안에 넣어 지역 변수로 만들기
- 고유의 네임 스페이스를 만들어 겹치지 않게 하기
var obj = { x: 'local', y: function() { alert(this.x); } }
--> 겹칠 우려 최소화
return은 한 번 출력하면 그 함수는 생을 마침
-그렇게 되면 함수 안의 지역 변수 값은 함수 종료와 함께 사라지기 때문에 그 값을 보존하기 위해 클로저가 생김
private valuable 사용 시 get, set 메소드
-get은 가져오는 것, set은 수정하는 것
- 클로저에 있는 세 가지의 스코프
-전역 범위(global scope)
-지역 범위(local scope)
-외부 함수 범위(outer functions scope)
- 변수 생성 3단계
- 선언 단계 : 변수를 실행 컨텍스트의 변수 객체에 등록 (스코프가 참조하는 대상)
- 초기화 단계 : 변수 객체에 등록된 변수를 위한 공간을 메모리에 확보 (undifined로 초기화)
- 할당 단계 : undefined로 초기화된 변수에 실제 값을 할당
- var 키워드로 선언된 변수는 선언 단계와 초기화 단계가 한 번에 이루어진다
-따라서 변수 선언문 이전에 변수에 접근해도 스코프에 변수가 존재하기 때문에 에러 발생 X
-다만 undefined를 반환 후 변수를 할당하면 그때 값이 할당된다 = 변수 호이스팅
- let 키워드로 선언된 변수는 선언 단계와 초기화 단계가 분리되어 진행
-초기화 이전에 변수에 접근하려고 하면 참조 에러(ReferenceError)가 발생
-변수가 아직 초기화되지 않았기 때문 -> 변수를 위한 메모리 공간이 아직 확보되지 않았기 때문
-스코프의 시작 지점부터 초기화 시작 지점까지의 구간을 ‘일시적 사각지대(Temporal Dead Zone; TDZ)라고 한다
var x = 0; { var x = 1; console.log(x); // 1 } console.log(x); // 1
- var는 함수 스코프를 따른다
- 첫 번째로 선언된 x와 두 번째로 선언된 x 모두 메인 함수의 전역 공간에 선언되어 있는 것
- 두 번째로 선언된 x가 값을 덮어 씌운 것
let y = 0; { let y = 1; console.log(y); // 1 } console.log(y); // 0
- 함수 선언문(function declarations) : function 명령어와 함께 함수명을 지정하고 function body 내용을 구성하는 것
function foo() { console.log("hello"); }
- 함수 표현식(function expresstions) : 변수에 함수를 할당하는 형태의 함수 표현식
var foo2 = function() { console.log("hello2"); }
var abc = "hi"; function abc() { console.log("bobo"); } function efg() { console.log("gogo"); } var efg = "bye"; console.log(abc); console.log(efg);
-> 값은 hi, bye