[JavaScript variable scope, variable hoisting] http://javascriptissexy.com/javascript-variable-scope-and-hoisting-explained/, JavaScript Definite Guide 3.9, 3.10, http://insanehong.kr/post/javascript-scope/ 읽고 정리함.
3.10 variable scope 참고
Global variable
- function 밖에서 선언된 모든 변수.
- global context(scope)는 window object(or 전제 HTML document)를 의미함.
var myName =“AAA" firstName = “BBB” //처럼 var없이도 쓸 수 있음
-
function 내에서 var 없이 선언된 변수는 global context(scope)에 추가되므로 global variable임.
-
JavaScript는 block-level scope를 가지지 않음. 함수 scope를 가짐
var firstName = ‘Bob’; { var firstName = ‘Richard’; } console.log(firstName) //Richard 출력. function test(o){ var i=0; if (typeof o == "object"){ var j=0; } console.log(j); //j는 정의(defined)되어 있음. o가 object면 0이 출력되고 object가 아니면 undefined 출력(값이 undefined). JS는 block-level scope가 아니기 때문에 block 밖에서 j에 접근 가능. } console.log(j);//Reference error. JS는 함수 scope를 가지기 때문에 j는 정의되어 있지 않음.
- setTimeout 내의 모든 함수들은 global scope에서 수행됨. 비록 객체 내에 setTImeout이 사용되더라도.
- setTimeout 내의 함수에서 this가 사용되면 this object는 global window object를 가리킴.
Variable Scope
- 지역변수를 전역변수와 같은 이름으로 설정하면 전역변수를 감출 수 있음.
- 지역 변수를 선언하기 위해서는 반드시 var를 사용해야 한다.
Variable hoisting
- 자바스크립트는 함수 유효범위를 가지고 있음. c.f., 블록 유효범위
- 이 함수안에서 선언된 모든 변수가 함수 전체에 걸처서 유효함.
- Hoisting: 모든 변수(함수) 선언(declaration)들은 함수의 맨 위로 올라감 (함수 밖에서 선언되었으면 global context의 맨위)
- 변수 초기화나 할당은 hoisting 안됨.
- 함수 expression이 변수에 할당되었을 경우 변수 declaration만 hoisting되지 함수 expression은 hoisting안됨.
function showName () { console.log ("First Name: " + name); var name = "Ford"; console.log ("Last Name: " + name); } showName ();
- 위 코드에서 showName()하면 First Name은 undefined로 출력됨. 이유는 JavaScript 엔진에서 variable hoisting을 해서 다음과 같은 코드로 수행하기 때문.
function showName () { var name; // name is hoisted (note that is undefined at this point, since the assignment happens below) console.log ("First Name: " + name); name = "Ford"; console.log ("Last Name: " + name); }
프로퍼티로서의 변수
- 전역변수는 전역객체의 프로퍼티.
- var로 선언한 전역변수는 delete로 삭제 불가능.
- non-strict mode에서 선언하지 않은 변수에 값을 지정하면 그 변수는 전역 변수가 됨.
Scope Chain (유효범위 체인)
- 변수 해석을 할 때 체인을 따라간다.
- 각 함수 객체는 Scope 프로퍼티를 가지며 Scope 프로퍼티는 함수 객체가 생성된 시점에 생긴 Object들의 레퍼런스들을 저장한다. 이 Object 레퍼런스들을 Scope chain이라고 한다.
- 함수 내에서 선언된 지역변수들이 Variable Object 라는 객체에 저장됨. 그리고 Scope chain에서 Variable Object의 레퍼런스를 가지고 있음.
- Scope chain은 전역변수의 Variable Object에 대한 레퍼런스도 가지고 있음.
- 최상위 자바스크립트 코드는 유효범위 체인이 전역 객체 하나이다.
- 중첩되지 않은 함수는 유효범위 체인이 함수 매개변수와 지역변수를 정의한 객체, 전역 객체 두개로 이루어짐.
중첩된 함수의 유효범위 체인은 세 개 이상의 객체로 이루어짐