
코어자바스크립트 ch3. this를 읽고 제 생각과 함께 정리한 내용입니다.
this는 실행컨텍스트가 생성될 때 함께 결정된다.
그렇다면 교재의 코드를 실행컨텍스트의 생성과 this를 중점으로 살펴보자.
// --------------------------------- (1)
var obj1 = {
outer: function () {
console.log(this);
var innerFunc = function () {
console.log(this);
};
innerFunc(); // ---------------- (3)
var obj2 = {
innerMethod: innerFunc,
};
obj2.innerMethod(); // --------- (4)
},
};
obj1.outer(); // ------------------- (2)

(1) 시작
environmentRecord에 obj1 식별자를 저장한다.outerEnvironmentReference에는 아무것도 담기지 않는다.(2) obj1.outer() 함수 호출
environmentRecord에 innerFunc와 obj2 식별자를 저장한다.LexicalEnvironment를 담는다. (obj1)(3) innerFunc() 함수 호출
environmentRecord에는 아무런 값도 담기지 않는다.outerEnvironmentReference에는 outer()의 LexicalEnvironment가 담긴다.(4) innerFunc() 종료 및 obj2.innerMethod() 실행
outerEnvironmentReference에는 outer()의 LexicalEnvironment가 담긴다.var obj1 = {
outer: function () {
console.log(this);
var innerFunc1 = function () {
console.log(this);
};
innerFunc1();
var self = this;
var innerFunc2 = function () {
console.log(self);
};
innerFunc2();
},
};
obj1.outer();

문자열의 경우 length 프로퍼티가 읽기 전용이기 때문에 원본 문자열에 변경을 가하는 메서드(push, pop, shift, unshift, splice 등)는 에러를 던지며 .. (p.83)
유사배열객체에는 배열 메서드가 적용이 되는데 문자열에는 안되는 이유가 뭘까?
ch1에서 공부했다싶이, 기본형 데이터는 불변값이고 참조형 데이터는 가변값이기 때문이다.
참조형 데이터의 변수영역은 얼마든지 다른 값을 바라볼 수 있기 때문에, 가변값이라고 설명할 수 있다.
var obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3
};
Array.prototype.push.call(obj, 'd') // {0: 'a', 1: 'b', 2: 'c', 3: 'd', length: 4}
var str = 'abc def';
Array.prototype.push.call(str, ', pushed string');