2014년 1월 17일 금요일

javascript scope

<title> [[scope]] </title>
    <script>
var e;
        function aa(a,b,c){
            var d = "1";
        }

        aa(1);

script는 싱글쓰레드임, 전통적인 스크립트 언어들은 정적메모리(const 등 ), 스텍 영역을 잡고 나머지를힙을 잡아서 프로그램을 실행한다
하지만 자바스크립트는 이런것들은 모두 브라우저에서 처리해줌(iexplore.exe, chrome.exe 등),대신 가상메모리(객체들의 집합)를 잡아서 실행함

함수란 부모 함수를 생성해야 생성됨, 기본적으로
(function(window){ }((window||global);
이런식으로 window가 전역에 바인드 되있음, 기본적으로 global이 적용됨

그 안에서 함수가 실행되면 execution context(실행영역)가 생성됨, ecmascript 3.1까진 ec라 하고 5부터는 lexical environment(어휘공간) 이라 함
실행영역이 생성되기 전에 함수가 실행될때 변수의 인자값들을 [a,b,c] 이렇게 배열식으로 넘김
그래서 ec1 = [a,b,c] 이런식으로 들어가 잇으면 함수에서 호출하는 a 인자값이 1이면 a는 1을 대입하고 나머진 undefined를 넣는다
ec자체도 해쉬맵이니까 그리고 arguments 객체에도 똑같이 넣는다  arguments객체 자체는 자신 함수를 호출하는 키 값을 잡고 잇음. callee
그리고 scope객체에 지금 현재 영역에 d가 잇으므로 d를 넣고 parent에 이 함수를 호출한 global를 넣는다. 만약
fn ee(){
    aa(){

    }
}
이랫엇으면 scope:ee.parent에 이런식으로 찾아갈꺼임
그래서 parent chain을 해서 상위 변수 값들을 찾는것임
ec가 사라질때는 함수 사용이 완료가 되면 그 함수 ec가 사라지는데 저렇게 변수 자체가 참조를 함

var f = function(){
    var a = 1;
    return function(){
        return ++a;
    };
};

var g = f();

g();
g();
alert(g());        //4

scope : parent가 참조함. 유일하게 외부 함수와 연결하는 연결고리가 살아있는데 이것을 사용하고 있으면 가비지컬렉터는 일어나지 않음
close와 비슷하게 closure 는 폐쇄란 뜻인데 공간이 폐쇄된 상태가 되어버림
이것을 자바스크립트에서 클로저라 부름

그리고 if(d = arr.length){
}
이런식으로 함 식을 평가하고 d의 값이 0이면 else로 탈것임




    </script>

댓글 없음:

댓글 쓰기