inflearn logo
강의

Course

Instructor

Intermediate-Advanced JavaScript: Engine Core

2. this reference scope, this and strict mode, this reference object, [cleanup time]

정리시간입니다.

269

buriburi

10 asked

6

var book = {
  value: 123,
  get: function(){
    var value = 456;
    console.log(this === window);
    console.log(this.value);
  }
};
var fn = book.get;
fn();
// true
// undefined
  1. strict 모드 환경이 아님
  2. 함수 선언문이 없다.
  3. 변수 초기화를 한다
    • book: undefined
    • fn: undefined
  4. 코드를 실행한다.

 

book = {
  value: 123,
  get: function(){}
}
  1. fn() 함수 호출 (book.get()을 실행)
  2. fn() 함수는 글로벌 함수이고, 함수 이름만 작성하여 호출 가능.
  3. 이때, 실행 콘텍스트를 생성하고, this 바인딩 컴포넌트에 window가 바인딩된다.
  4. this는 window를 참조하게 된다.
  5. 또한 글로벌 오브젝트를 windonw 오브젝트가 참조함
  6. book.get 함수 안으로 들어감
  7. 함수 내부에 함수 선언문이 없다.
  8. 변수 초기화
    • value: undefined
  9. 코드 실행
    • value: 456가 설정
    • console.log(this === window); 는 true를 출력
    • console.log(this.value)에서도 this가 window를 참조
    • window 즉, 글로벌 오브젝트에는 value라는 프로퍼티 이름을 가진 프로퍼티가 존재하지 않아서 undefined를 출력
      • 여기서 console.log(value)를 하면 456
      • console.log(book.value)를 하면 123
      • console.log(window.value)를 하면 undefined가 출력되는 것을 알 수 있음

 

실행 콘텍스트: {
  렉시컬 환경 컴포넌트: {
    환경 레코드: {
      book: Object,
      fn: function(){}
    },
    외부 렉시컬 환경 참조 {}
  },
  변수 환경 컴포넌트: {},
  this 바인딩 컴포넌트: {
    this: window
  }
}
(get) 실행 콘텍스트: {
  렉시컬 환경 컴포넌트: {
    환경 레코드: {
      value: 456,
    },
    외부 렉시컬 환경 참조: {
      value: 123,
    }
  },
  변수 환경 컴포넌트: {},
  this 바인딩 컴퍼넌트: {
    this: book
  }
}

 

 

 

function getTitle(){
  console.log("HTML");
};
var book = function(){
  function getTitle(){
    console.log("JS");
  };
  this.getTitle();
  getTitle();
};
book();
// HTML
// JS
  1. strict 모드 환경이 아님
  2. 함수 선언문을 만나 getTitle function 오브젝트 생성
  3. 변수 초기화를 한다
    • book: undefined
  4. 코드를 실행한다.

 

getTitle: function(){}
book: function(){}
  1. book() 함수 호출
  2. book() 함수는 글로벌 함수이고 호출되면서 실행 콘텍스트를 생성하고 this 바인딩 컴포넌트에 window를 참조
  3. this는 window를 참조하게 된다.
  4. 또한 글로벌 오브젝트를 windonw 오브젝트가 참조함
  5. book 함수 내부로 들어감
  6. 함수 선언문 getTitle을 만나서 function 오브젝트 생성
  7. getTitle은 렉시컬 환경 컴포넌트의 환경 레코드에 설정
  8. 함수 표현식과 변수가 없어서 변수 초기화는 패스
  9. 코드 실행
  10. this.getTitle() 함수를 호출할 때, this는 window를 참조함
  11. window 즉, 글로벌 오브젝트에 getTitle이라는 프로퍼티 이름을 검색

 

getTitle: function(){
  console.log("HTML");
}
book: function(){
  getTitle: function(){}
}
  1. getTitle이 존재하므로 함수 실행
  2. console에 HTML 출력
  3. 다시 book 함수 내부의 getTitle();를 만나서 호출
  4. 환경 레코드에서 getTitle이 존재하여 실행
  5. console에 JS 출력

 

실행 콘텍스트: {
  렉시컬 환경 컴포넌트: {
    환경 레코드: {
      book: function(){},
      getTitle: function(){}
    },
    외부 렉시컬 환경 참조 {}
  },
  변수 환경 컴포넌트: {},
  this 바인딩 컴포넌트: {
    this: window
  }
}

 

(getTitle) 실행 콘텍스트: {
  렉시컬 환경 컴포넌트: {
    환경 레코드: {},
    외부 렉시컬 환경 참조 {
      book: function(){}
    }
  },
  변수 환경 컴포넌트: {},
  this 바인딩 컴포넌트: {
    this: window
  }
}

 

(book) 실행 콘텍스트: {
  렉시컬 환경 컴포넌트: {
    환경 레코드: {
      getTitle: function(){}
    },
    외부 렉시컬 환경 참조 {
      getTitle: function(){}
    }
  },
  변수 환경 컴포넌트: {},
  this 바인딩 컴포넌트: {
    this: window
  }
}

 

(getTitle) 실행 콘텍스트: {
  렉시컬 환경 컴포넌트: {
    환경 레코드: {},
    외부 렉시컬 환경 참조 {
      getTitle: function(){}
    }
  },
  변수 환경 컴포넌트: {},
  this 바인딩 컴포넌트: {
    this: book
  }
}

javascript

Answer 0

getBook 실습 예제중 질문드립니다!

0

419

1

__proto__ 에 대해 질문드립니다

0

315

1

호이스팅 코딩시간 풀이

0

358

1

[코딩 시간] JS {name: value} 이해

0

340

1

[[Scope]] 와 [[Environment]]는 같은 개념인가요

0

345

0

slice

0

239

0

스코프가 뭔가요?

0

307

0

어려워요

0

255

0

강사님 변수이름에 get을 붙이는 이유를 알고싶습니다.

0

339

1

[정리 시간] 정확하게 이해했는지 확인 부탁드립니다.

0

300

0

스코프 질문

0

253

1

fn 함수와 book.get 함수 차이 질문드립니다...ㅠㅠㅠ

1

542

1

this binding 논리 질문입니다.

0

279

1

파라미터 값을 매핑할 때

0

251

0

ES6부터는 this 바인딩을 환경 레코드에서 참조한다고 들었습니다.

0

209

0

정리시간 입니다.

0

228

0

정리 시간 입니다.

0

203

0

정리시간입니다.

6

227

0

코딩시간 입니다.

1

222

0

선생님 스코프 질문이 있습니다.

1

240

0

[정리시간] 해보았습니다!

0

175

0

선생님 질문있습니다!!

0

159

0

질문드려도 될까요 선생님..

0

217

0

엔진이 식별자 해결을 위해서 스코프를 사용한다고 하셨는데

0

185

0