const b = 'javascript';
const c = 1;
console.log(b || c); // 'javascript'
함수는 객체의 특별한 형태이며 문(statement)으로 구성된 몸체를 가진 하나의 실행 단위이다.
자바스크립트의 함수는 일급 함수(first-class function)
로서 다른 함수의 매개변수나 반환 값으로도 사용할 수 있다.
다른 함수의 인자로 넘어가는 함수를 콜백 함수
라고 부른다.
가장 대표적인 예로는 DOM에 이벤트를 추가하는 addEventListener()
함수가 있다.
button.addEventListener
호이스팅(hoisting)
으로 인해 함수가 선언된 위치에서 코드의 최상단으로 끌어올려진다. 따라서 함수는 선언된 위치보다 상단에서 호출될 수 있다.함수 이름이 선택 사항
이며, 변수에 함수를 직접 할당한다.매개변수 해체 할당은 객체와 배열 모두 가능
하며 프로퍼티가 없는 변수는 undefined를 할당 받는다
화살표 함수를 제외한 모든 함수
에서 arguments라는 객체를 사용할 수 있다.
인덱스
로 프로퍼티에 접근할 수 있고, length
프로퍼티를 가지고 있다.나머지 매개변수
로 대체할 수 있다.진짜 배열
이기 때문에 인자들을 배열로 다루고 싶은 경우 유용하게 사용 가능하다.함수를 호출한 방법에 의해 값이 달라진다.
전역 객체
를 참조한다.window
객체가 전역 객체가 되고, Node.js 환경에서 실행 시 global
객체가 전역 객체가 된다.new 키워드를 사용하여 함수를 호출하면 생성자 함수로 동작한다. 생성자 함수의 this 바인딩은 일반 함수 호출과는 다르게 동작한다.
생성자 함수를 호출하여 객체를 생성
하였다. 생성자 함수를 호출하여 객체가 생성될 때 아래와 같은 단계로 동작한다.
생성된 객체
는 생성자 함수의 prototype 프로퍼티
에 해당하는 객체를 프로토타입([[Prototype]])
으로 설정한다.생성자 함수 호출 시 객체가 생성되는 과정과 함께 this 바인딩이 어떻게 되는지 알아보았다. 이러한 과정은 반드시 new 키워드와 함께 생성자 함수를 호출한 경우에만 실행된다.
자바스크립트에서는 객체의 프로퍼티인 함수를 일반 함수와 구분하여 메서드라고 부르며, this 바인딩도 일반 함수와는 다르게 동작한다. 메서드를 호출하면 this는 해당 메서드를 소유하는 객체로 바인딩된다.
여기서 중요한 것은 메서드를 어떻게 호출했느냐에 따라 this 바인딩이 달라진다
는 것이다.
함수의 컨텍스트가 어디에 속하는지 알 수 없다. 이 경우 this는 전역 객체를 참조하거나 엄격 모드인 경우에는 undefined로 남아 있게 된다.
일반 함수, 메서드, 생성자 함수의 예시를 보며 js 가 내부적으로 this를 어떻게 바인딩 하는지 알아보았다.
자바스크립트에서는 함수의 내장 메서드인 call, apply, bind
메서드를 이용하여 this로 바인딩될 객체를 변경할 수 있다. 이러한 방법을 명시적 바인딩
이라고 부른다.
this를 특정 객체에 바인딩하여 함수를 호출하는 역할
을 한다.배열 형태
로 전달해야 한다.this 바인딩을 영구적으로 변경한다.
단, 생성자 함수로 사용되는 경우는 예외이다.새로운 함수를 반환한다.
this를 고정하고 싶을 때 사용한다.
함수에 전달할 인자도 고정시킬 수 있다.
화살표 함수는 this를 바인딩하지 않는다. 그렇기 때문에 이전의 this 바인딩 규칙과는 완전히 다르게 동작한다.
화살표 함수의 this는 화살표 함수를 둘러싸고 있는 렉시컬 스코프에서 this의 값을 받아 사용한다.
렉시컬 this
라고 하며, 이 값은 변경되지 않는다.렉시컬 스코프
는 자바스크립트 엔진이 변수를 찾는 검색 방식에 대한 규칙이며, 함수를 어디에 선언했는지에 따라 결정된다.변경되지 않는 렉시컬 this를 갖는다
. 이러한 특징 때문에 화살표 함수의 this는 call, apply, bind 함수를 사용하여 변경할 수 없다.일반 함수
를 addEventListener() 함수의 콜백으로 넘긴 경우 this는 event.currentTarget
프로퍼티와 동일한 값을 가진다. 하지만 화살표 함수
를 사용하는 경우에는 렉시컬 this로 동작이 완전히 달라지기 때문에 this를 통해 요소에 접근할 수 없다
.this 바인딩은 함수 호출에 따른 컨텍스트에 따라 달라지며 call(), apply(), bind()와 같은 메서드를 사용하여 변경할 수 있다.
단, ES2015에서 등장한 화살표 함수는 이전의 함수 선언문, 함수 표현식과는 다르게 렉시컬 this
를 가지기 때문에 생성자 함수로 사용할 수 없으며, this 바인딩을 변경할 수 없다.