undefined == null //true
undefined === null //false
VariableEnvironment : 최초 실행 시의 스냅 샷을 유지
LexicalEnvironment : VariableEnvironment 을 복사 해 만들어져, 이후 주로 활용
ThisBinding
environmentRecord : 그 함수 환경 내부에서 가지고 있는 것 (지역변수와 같은 것)
outerEnvironmentReference : 바깥과 연관된 것
=> outerEnvironmentReference로 인해서 내부부터 외부까지 값이 있는지를 찾아 나간다.
ex) ojb['method'](2)
의 method는 예외로 .이없어도 메소드다
우회하는 이유 : 호출하는 주체가 없을 때는(함수사용시) 자동으로 전역객체를 바인딩하지 않고 호출 당시 주변 환경의 this를 그대로 상속받기 위해서
함수 혹은 메소드가 호출 되었을 때 (함수는 전역객체를 가리키고 메소드는 그때에 해당하는 바로앞의 객체를 나타낸다.)
let obj = {
outerFunc : function(){
console.log(this);
},
outerArrowFunc : ()=>{
console.log(this);
},
innerFunc : function(){
let innerF = function(){
console.log(this);
}
innerF();
},
innerArrowFunc : function(){
let innerF = ()=>{
console.log(this);
}
innerF();
}
}
obj.outerFunc(); //obj객체
obj.outerArrowFunc(); //전역객체
obj.innerFunc(); //전역객체
obj.innerArrowFunc(); //obj객체
- 메소드로 obj를 나타내므로 this는 obj
- 메소드로 obj를 나타내나 화살표함수이므로 this 바인딩을 하지않은 상태의 전역객체를 나타낸다.
- 메소드로 obj를 나타내는 innerFunc 상황에서 innerF()라는 함수를 실행한 this는 this가 bind되므로 전역객체를 나타낸다.
- 메소드로 obj를 나타내는 innerArrowFunc 상황에서 innerF()라는 함수를 실행하나 화살표함수로 진행되므로 this 바인딩이 진행되지않아 이전의 this인 obj객체가 this형태로 남아있다.
- 주의할 점 (중요)
- this를 관련한 묶음을 실행한 것이 함수냐 메소드냐
- 해당 함수 혹은 메소드가 this 바인딩을 했냐 안했냐 (화살표 함수 or 그냥 함수)
객체1.메서드실행 - 함수 : 객체
객체1.메서드실행 - 화살표함수 : 이전this(혹은 전역객체)
객체1.메서드실행 - 함수 - 함수실행 : 함수이므로 전역객체
객체1.메서드실행 - 함수 - 화살표함수실행 : 이전this이므로 해당하는 객체1
- call 메소드 (값을 받을때)
- apply 메소드 (배열을 받을때)
- bind 메소드
즉시가 아닌 새로운함수를 반환하기만 하는 메서드