스코프(scope): 코드가 현재 실행되는 환경, 맥락을 의미하는 단어
실행 컨텍스트(execute context)에 포함되는 것: 스코프 체인, this 포인터, variable objects
아무런 코드가 없을경우 this는 window를 가리킨다
자바스크립트 엔진은 코드가 없어도 실행환경(실행 컨텍스트)을 초기화한다.
스코프는 코드가 현재 실행되는 환경, 맥락(context)를 의미한다.
this 포인터, 스코프에 저장된 변수들, 스코프 체인 등이 환경에 포함도니다.
this 포인터의 경우 글로벌 스코프에서는 window를 가리킨다.
function myFunc() {
let a = 10;
let b = 20;
function add(first, second) {
return first+second
}
return add(a,b);
}
myFunc();
myFunc의 스코프
add()의 스코프
위: myFunc(), 아래: window
위: method funciton
객체의 메서드의 경우 메서드 환경의 this는 해당 객체를 가리키게 된다.
하지만 this가 가리키는 것은 환경에 따라 변할 수 있다.
실행컨텍스트: 자바스크립트 코드가 실행되는 환경
코드에서 참조하는 변수, 객체(함수 포함), this 등에 대한 레퍼런스가 있다.
실행 컨텍스트는 전역에서 시작해 함수가 호출될때 스택에 쌓이게 된다.
자바스크립트가 실행될때 전역 실행 컨텍스트(global)가 만들어진다.
함수가 실행될때 함수 실행 컨텍스트 (function)가 만들어진다.
함수 호출되는 상황 4가지
그 외 콜백 함수의 호출이 있다.
콜백 함수는 특정 동작 이후 불려지는 함수이다.
보통 다른 함수의 인자로 보내지는 함수를 의미한다.
함수의 호출 환경에 따라 this는 동적으로 셋팅된다.
this가 환경에 따라 바뀌는 것을 동적 바인딩(dynamic binding)이라고 한다.
bind, apply, call 등으로 this가 가리키는 것을 조작할 수 있다.
최상단 스코프의 실행 컨텍스트는 전역이다.
setTimeout으로 함수의 실행 환경을 바꾼다.
여기서 내이름은 undefined 인 이유: 그 전 캡처를 보면 객체 내부의 function은 원래 this가 객체를가리키지만 setTimeout에서 this를 전역으로 바꿔버린다. global에는 name이 없으므로 undefined
const myCar = {
name: 'hola',
oil: 'gasoline',
getname: function() {
return this.name;},
getOil: function() {
reuturn this.oil;}
}
const toy = {
brand: 'lego',
type: 'robot',
getBrand: function(){return this.brand},
getType: function(){return this.type},
changeBrand: function(newBrand){this.brand = newBrand},
changeType: function(newType){this.type = newType}
}
function hello(arr) {
let newstr = ``;
arr.forEach(function (e) {
newstr += `<li>${e.name}</li>`;
}
return newstr;
}
let height = people.filter(e => e.height >= 175);
화살표 함수의 this는 정해지면 바꿀 수 없다.
can, bind, apply를 사용해도 안바뀜
setTimeout 등 this가 바뀌는 상황에서 유용하다.
function findMin(...rest) {
return rest.reduce((a, b) =>
a < b ? a : b)
}
findMin(7, 3, 5, 2, 4, 1) // 1
const o = {
name: "Daniel",
age: 23,
address: "Street",
job: "Software Engineer",
};
const {age, name, ...rest} = o;
findSamePerson(age, name);
function sumArray(sum, arr) {
if(arr.length === 0) return sum;
const [head, ...tail] = arr;
return sumArray(sum + head, tail);
}
sumArray(0, [1, 2, 3, 4, 5]);