실행컨텍스트와 관련된 키워드를 정의 위주로 간략하게 정리한 글입니다.
상세한 내용은 참고링크를 통해 더 확인할 수 있습니다.👸
자바스크립트가 실행되고있는 컨텍스트(환경)
실행할 코드*
에 제공할 환경 정보*
들을 모아둔다.hoisting
)scope 탐색
, scope Chainning
*실행할 코드
:
*환경정보
: 어떤 변수가 있는가, 어떤 변수를 hoisting할지, scope와 scopeChain을 확인하고, this는 어디에 어떻게 binding 되는지 등등...
변수의 선언
을 끌어올리는 것, 선언은 했지만 어떤 값이 할당되었는지는 파악하지 않는다. 코드가 실행되는 시점에 값을 할당하며 그 전까지는 undefined
이다.
표현에 따른 hoisting차이
구분 | 호이스팅 O | 호이스팅 X |
---|---|---|
함수 | 함수선언식 | 함수표현식 |
변수 | var | let, const |
function someFunc(){...}
var someFunc = () => {...}
호이스팅 된 경우
//*var
console.log(test) //undefined :호이스팅
var test = 'red'
console.log(test) //red
호이스팅 되지 않는 경우
//*let 호이스팅 불가능
console.log(subway)
let subway = 'egg'
let subway = 'ham'
//Uncaught ReferenceError: subway is not defined
변수가 살아있는 유효범위
만약 스코프가 없었다면, 절대 중복되지 않는 변수명을 써야한다.
Global Scope : browser - window
, Node.js - global
var
로 선언한 변수는 전역객체의 프로퍼티가 된다.
Lexical Scope :함수를 호출한 위치가 아닌, 함수를 선언한 위치에 따라 결정된다.
*자바스크립트의 기본스코프
: 함수 레벨 스코프 (Function-level-scope)
변수가 var, let, const
에 상관없이 모두 함수 단위에서만 유효하다.
(function () {
var x = 5;
})();
console.log(x); // Uncaught ReferenceError: x is not defined
var
가 해당된다.if (true) {
var x = 5;
}
console.log(x); //5
let
, const
일때 적용된다.if (true) {
let x = 5;
}
console.log(x)
//Uncaught ReferenceError: x is not defined
블록 내의 변수와 블록 외의 변수를 다르게 취급한다.
if (true) {
let x = 5;
}
let x =10;
console.log(x) //10
변수가 해당 scope에서 유효하지 않을 때, 안에서부터 바깥으로만 차례로 검색해 나가는 것
함수가 선언될 때 scope가 만들어지는데
함수가 종료된 이후에도 scope가 유효하여 변수를 참조할 수 있는 상황
외부함수와 그 함수에 내부함수가 존재하며 결과값으로 내부 함수를 반환하고 있는 경우이다.
외부함수가 실행되어 죵료되어도 외부함수의 scope가 GC에 의해 삭제되지 않고 유효하여, 반환된 내부함수가 계속해서 해당 scope를 참조할 수 있는 상황이다.
*GC: Garbage Collector
함수 호출 | 메서드 호출 | |
---|---|---|
ex | someFunc() | someFunc.play() |
this 주체 | 전역객체 | 인스턴스 |
일반함수로 호출할 때의 this는 전역객체를 나타내며
.프로퍼티 형태의 메서드로 호출할 때에는 . 앞의 객체를 this로 인식한다.
*주의할 점: 객체가 함수를 직접! 호출해야 메서드이다.
let user = {
name: 'kim',
underTwenty: function(age) {
console.log(this)
return age < 20;
}
}
user.underTwenty(30); // 메서드 : user
const under20 = user.underTwenty;
under20(15); //함수 : Window
const { underTwenty } = user
underTwenty(15) //함수 : Window
메서드로 호출한 경우 user
객체가 this이고
함수로 호출한 경우 this는 전역객체 window
가 해당된다. 때문에 window.name으로 접근하여 빈 문자열을 반환한다.
callbackFunc.call(this, arg1, arg2)
: 파라미터 전달callbackFunc.apply(this, [arg1, arg2..])
: 배열 전달callbackFunc.bind(this)
:함수를 생성하기만 하였고 실행하지 않음arrowFunction
: scope chain의 가장 가까운 this로 대상 결정!(주의! 메서드를 호출한 경우에도 프로퍼티 앞의 인스턴스를 this로 지정하는 것이 아니라 scope chain 상 가까운 this를 찾는다.)