this / 클로저

null·2022년 7월 25일
0

함수를 호출하는 방법에 의해 결정 된다.

선언에 따라: 클로저
호출하는 방법에 따라: this. 물론 함수가 어떻게 호출 되었는지와 무관하게 설정하는 것은 bind.

var amo = {
 name: 'john',
 age: function(){
 	console.log(this);
 }
};

amo.age(); 
var amovae = amo.age;

amovae();

두개는 호출 방식이 달라. 저 점이 중요한데 점 앞을 보면서 이 함수를 부른 주체가 누구인지.
1번의 주체는 amo. 2번의 주체는 amovae.

그럼 만약에 바로 하고 싶다믄.
var bindAmo = amovae.bind(amo); // this를 amo로 하겠다. 지정 하겠다!

클로저
스코프를 먼저 알아보자.
어떤 함수를 실행했어요. 그 함수엔 a라는 변수가 들어있고. 그 변수 a를 console.log(a); 호출했어.
그럼 a를 찾아야하자나. 어딨는지. 그 찾는 곳이 scope다.
자바스크립트에선 함수단위로 scope가 존재한다.

생성한 시점에 스코프체인을 계속 들고 있는다.

scope

funtion add(x,y) {
	console.log(x,y);
    return x + y
}

add(3,6);

console.log(x,y)

여기서 console.log는 어떤값이?
추측하자면 3,6 and undefined?

x도 y도 자신이 선언된 위치에 따라 본인의 유효 범위 즉 스코프가 결정 됐다.
즉 스코프란 변수나 함수 이름과 같은 식별자가 본인이 선언된 위치에 따라 다른 코드에서 자신이 참조될 수 있는지 없는지 결정 되는 것.
여기서 식별자란? 어떤 데이터를 식별하는데 사용하는 이름, 변수명.

모든 코드는 전역 혹은 지역으로 나뉜다.
여기서부터 스코프 체인은 시작 된다..
함수 내부에 정의된 함수를 중첩함수..
중첩 함수를 포함하는 함수를 외부 함수.

스코프가 계층적으로 연결되어 있는 건 스코프 체인
자바스크립트엔진은 스코프 체인을 토오해 변수를 참조한다.
현재 함수가 어떤 변수를 참조하려고 하는데 내 스코프에 없다면? 하나 위로 올라간다. 그렇게 그렇게..전역 스코프까지 올라갔는데도 없다면 레퍼런스 에러..
스코프 체인은 무조건 위로만 올라간다!!!!반방향성.

스코프레벨은
1.블록레벨스코프 if.. for.. 함수... > 대부분의 프로그래밍 언어에서..
2.함수레벨스코프 only 함수... > var 키워드로 선언된 변수는 오로지 함수 코드 블록만을 지역 스코프로 인정한다..
자바스크립트는 1을 가지지 못하고 있었어.. 고것이 let / const
함수 뿐만아니라 블록 레벨 스코프가 가능해짐.
자바스크립트 함수는 태어난 순간 본인의 내부 슬롯에 상위 스코프에 대한 참조를 저장한다.

클로저는 외부함수 내부에 선언된 함수가 외부함수가 실행 컨텍스트에서 사라진다. 혹은 함수가 종료된 후에도 외부함수의 변수를 참조할 수 있는 현상.
왜냐하면 자바스크립트에서 함수는 생성 시기에 자기 내부 슬롯에 상위 스코프에 대한 참조를 저장해.

스코프 체인은 함수에서 소스코드 해석이 불가능하니까 바로 이전의 스코프로 이동해서 정보를 찾는 것.

profile
개발이 싫어.

0개의 댓글