- 코어 자바스크립트 책 요약 (this 파트)
@@ 오늘은 이어서 코어 자바스크립트의 this 파트를 읽었다.
수업때 배웠던 전역/함수/메서드/construction mode/call,apply,bind 에서의 5가지 패턴에 더해서 좀 더 자세하게 각 상황별 this 의 값과 그 값이 나오는 이유에 대해서 명확히 알아볼 수 있었다.
수업에서 setTimeout 함수에서 첫번째 인자인 콜백함수에 bind()로 this값을 명시해줘야 한다고 배울 때 쉽사리 이해가 가지 않던 부분이 있었는데, 책을 읽으면서 콜백함수도 결국은 함수이기 때문에 this 값이 명시 되지 않은 경우 window를 가리킨다는 이야기를 듣고 그 궁금증이 풀렸다. bind도 call/ apply와의 차이점이 명확하지 않았는데 복습을 하다보니 call / apply와 다르게 this를 바인딩 한 함수를 리턴한다는 개념을 다시 머릿속에 넣을 수 있었다.
책에서 다음 읽어야하는 파트는 콜백 함수이다. 내일부터 이머시브 수업이 진행되기 때문에 솔로위크 만큼의 속도로는 읽지 못하겠지만 꾸준히 읽어서, 남은 4-7 파트도 꼭 완주해야겠다.
전역 공간에서 this는 전역 객체를 가리킨다
전역 변수를 선언하면 자바스크립트 엔진은 전역 객체의 프로퍼티로도 할당한다.
자바스크립트의 모든 변수는 실은 특정 객체의 프로퍼티로서 동작한다.
특정 객체란 바로 실행 컨텍스트의 LexicalEnvironment다.
실행 컨텍스트는 변수를 수집해서 L.E의 프로퍼티로 저장한다.
변수에 접근하고자 하면 스코프체인에서 해당 변수를 검색한다. 마지막 전역 스코프까지 도달하고도 담긴 값이 없으면, undefined를 해당 프로퍼티 조차 없으면 에러를 발생시킴
프로퍼티를 삭제하는 delete연산자를 사용하여 변수를 삭제할 때 (전역 변수 또한 전역객체의 프로퍼티이므로) 처음부터 전역객체 프로퍼티로 할당한 경우 삭제가 되지만 전역변수로 선언한 경우엔 삭제가 되지 않는다. (자바스크립트의 방어전략, 전역변수 선언시 configuable 속성을 false로 정의)
콜백 함수도 함수이기에 기본적으로 this 가 객체를 참조한다.
콜백함수를 인자로 받은 함수에서 콜백함수에 this 가 될 대상을 지정한 경우엔 그 대상을 참조한다.
콜백 함수의 제어권을 가지는 함수(메서드)가 콜백 함수에서의 this를 결정한다.
프로그래밍적으로 생성자는 구체적인 인스턴스를 만들기 위한 일종의 틀
이 틀에는 해당 클래스의 공통 속성들이 미리 준비 돼있고, 구체적 인스턴스의 개성이 더해 개별 인스턴스를 만들 수 있다.
함수가 생성자 함수로서 호출된 경우, 내부에서 this는 곧 새로 만들 구체적 인스턴스 자신이 된다.
생성자 함수 호출시, 생성자의 prototype 프로퍼티를 참조하는 proto라는 프로퍼티가 있는 객체를 만들고, 미리 준비된 공통 속성 및 개성을 해당 객체에 부여
call / apply / bind
Function.prototype.call(thisArg[, arg1[, arg2[, ... ]]])
호출 주체인 함수를 즉시 실행하는 함수 call
. 첫번째 인자로 this 바인딩. call을 이용하면 임의의 객체를 this로 지정 가능.
call / apply 활용 사례
유사배열 객체에 배열 메서드 사용 ( 키가 0 또는 양의 정수인 프로퍼티 존재, length 프로퍼티 값이 0 또는 양의 정수인 객체, 즉 배열의 구조와 유사한 객체)
배열 메서드를 이용하여 slice로 유사배열을 복사하면, 배열로 반환된다.
arguments 객체도 또한 유사배열객체이므로 배열로 변경 가능하다.
문자열에도 사용가능하지만, 원본 문자열을 변경하는 메서드는 에러를 던지고, concat 등은 제대로된 결과를 얻을 수 없다.
ES6엔 유사배열 객체 또는 순회 가능한 모든 종류의 데이터 타입을 배열로 변환하는 Array.from() 메서드를 새로 도입했다.
생성자 내부에서 다른 생성자를 호출
여러 인수를 묶어 하나의 배열로 전달하고 싶을 때 활용 (ex. Math.max, Math.min)
bind 메서드
상위 컨텍스트의 this를 내부함수나 콜백 함수에 전달
화살표 함수에서 실행 컨텍스트 생성시, this를 바인딩하는 과정이 제외됨. this 에 접근하고자 하면 스코프 체인상 가장 가까운 this에 접근.
별도의 인자로 this를 받는 경우 (콜백 함수 내에서의 this)
콜백 함수를 인자로 받는 메서드 중 일부는 추가로 this 로 지정할 객체(thisArg)를 인자로 지정할 수 있는경우가 있다.
forEach()의 두번째 인자 thisArg 에 this를 지정할 수 있다. (map, set 등의 배열 메서드에서도 일부 존재)