JavaScript variable scope, variable hoisting

[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에 대한 레퍼런스도 가지고 있음.
  • 최상위 자바스크립트 코드는 유효범위 체인이 전역 객체 하나이다.
  • 중첩되지 않은 함수는 유효범위 체인이 함수 매개변수와 지역변수를 정의한 객체, 전역 객체 두개로 이루어짐.
    중첩된 함수의 유효범위 체인은 세 개 이상의 객체로 이루어짐

Leave a comment