클로저

지환·2024년 5월 31일
0

자바스크립트

목록 보기
7/30

중첩함수

  • 새로운 객체의 프로퍼티 형태나 중첩 함수 그 자체로 반환 될 수 있음.

  • 반환된 중첩함수는 어디서든 호출해서 사용 할 수 있음.

  • 외부 변수에 접근할수있다는 사실은 변함 없음

function sayHiBye(firstName,lastName){
    
        function getFullName(){
        return firstName + " " + lastName;
    
}                              
                                      
  alert( "Hello, " + getFullName() );
  alert( "Bye, " + getFullName() );
                                      
 }

  • getFullName() : 이름 전체를 반환해주는 중첩함수
function makeCounter(){
    
    let count = 0;
    
    return function(){
    return count++;
    };
}

let counter = makeCounter();

alert(counter());
//0
alert(counter());
//1
alert(counter());
//2

변수

  • 실행중인 함수, 코드블록 {...} 스크립트 전체는 "렉시컬 환경" 이라 불리는 "내부숨김연관객체"를 갖는다.

  • 렉시컬환경객체

    • 환경레코드 : 모든 지역변수를 프로퍼티로 저장하고 있는 객체(this)도 여기에 저장
    • 외부렉시컬환경에 대한 참조 : 외부 코드와 연관됨.
  • 변수는 "환경 레코드의 프로퍼티" 일 뿐이다.

  • 변수를 가져오거나 변경 하는 것은 "환경 레코드의 프로퍼티틑 가져오거나 변경함을 의미"

execute start --- phrase:<uninitialized>
    
let phrase ---- phrase : undefined

phrase = "hello" ---- phrase : "hello"

phrase = "Bye" ---- phrase : "Bye"
  • 스크립트가 실행되면 "스크립트 내" 선언한 변수 전체가 --> 렉시컬 환경에 올라감

    • 자바스크립트 엔진은 uninitialized 상태의 변수를 인지하긴 하지만, let를 만나기 전까진 이 변수를 참조할 수 없음.
  • let phrase : 프로퍼티 값은 undefined

    • 이 시점 이후로 phrase 사용 가능
  • phrase에 값이 할당 됐음.

  • phrase의 값이 변경됐음.


정리 : 변수는 환경 레코드의 프로퍼티이다.

  • 환경 레코드는

    • 현재 실행 중인 함수
    • 코드 블록
    • 스크립트 --->연관있음.
  • 변수를 변경하면 환경 레코드의 프로퍼티 변경

함수 선언문

함수 선언문으로 선언한 함수는 일반 변수와는 달리 바로 초기화된다.

  • 함수 선언문으로 선언한 함수는 렉시컬 환경이 만들어지는 "즉시" 사용가능

  • 변수는 let를 만나 선언이 될 때까지 사용 x (함수와 변수의 차이점)

  • 선언 되기도 전에 함수를 사용 할 수 있음.

let phrase = 'hello';
function say(name){
    alert(`${phrase}`)
}

초기에

phrase : <uninitialized>
say : function 

바로 초기화 되는 것을 볼 수 있음.

내부와 외부 렉시컬 환경

  • 함수를 호출 -> 실행 하면 -> 새로운 렉시컬 환경이 자동으로 만들어짐
let phrase = 'hello';
function say(name){
    alert(`${phrase}`)
}
  • 함수가 호출중인 동안엔 호출중인 함수를 위한 내부 렉시컬 환경 / 외부 렉시컬 환경을 갖게된다.
profile
아는만큼보인다.

0개의 댓글