객체 : 상태 나타내는 프로퍼티 + 동작 나타내는 메서드
메서드 : 자신이 속한 객체의 상태 프로퍼티 참조,변경 가능 그러기위해서는 자신이 속한 객체 가리키는 식별자 참조!
객체 리터럴로 객체 생성시, 메서드 내부에서 메서드 자신이 속한 객체 가르키는 식별자 재귀적으로 참조가능
생성자함수로 인스턴스 생성 하려면 생성자 함수가 존재해야함 생성자 함수 정의하는 시점에서는인스턴스 생성 전 이라 생성자 함수가 생성할 인스턴스를 가리키는 식별자를 알수 없다. 그래서 JS는 this라는 특수 식별자를 제공함
this는 자기 참조 변수로 자신이 속한 객체, 인스턴스를 가리킴. this로 자신이 속한 객체, 생성할 인스턴스의 프로퍼티/메서드 참조 가능 (this는 JS엔진이 암묵적으로 생성, 코드 어디서든 참조가능. )
this 바인딩은 함수 호출방식에 의해 동적으로 결정됨
strict mode가 적용된 일반 함수 내부의 this는 undefined가 바인딩됨. (일반 함수로 호출하면 함수 내부의 this에는 전역 객체 바인딩, 객체를 생성하지 않은 this는 의미가 없음)
함수 호출 방식
콜백함수가 일반함수로 호출된다면 콜백 함수 내부의 this에도 전역 객체가 바인딩됨. 어떤 함수라도 일반 함수로 호출되면 this에 전역 객체 바인딩됨
→ 일반함수로 호출된 모든 함수(중첩함수, 콜백함수 포함) 내부 this에는 전역 객체가 바인딩됨
하지만 함수내부에 this가 같아야 하는데 다르면 문제가 있음 this 를 일치시키기위해
that이나, Function.prototype.apply, Function.prototype.call , Function.prototype.bind 메소드를 사용한다 혹은 화살표 함수 사용해 this 일치시킨다.
this.value 에서 this는 메서드 소유한 객체가 아니고, 메서드를 호출한 객체가 바인딩되는것
apply call 입력 표기법 다른거 빼고는 같다. apply는 호출할 함수의 인수를 배열로 묶어 전달. call은 함수의 인수를 쉼표로 구분한 리스트 형식으로 전달.
arguments 객체는 배열이 아니라서 Array.proptotype.slice같은 배열 메서드 사용 불가하나 apply call 메서드 이용 가능
bind는 함수 호출없이 this로 사용할 객체만 전달.
일반 함수 호출 — 전역객체로 this 바인딩
메서드로 함수 호출 — 메서드 호출한 객체로 this바인딩
생성자 함수 호출 — 샘성자 함수가 (미래에)생성할 인스턴스 this 바인딩
Function.property.apply/call/bind 메서드에 의한 간접호출 -Function.property.apply/call/bind메서드에 첫번쨰 인수로 전달한 객체