자바스크립트에서 함수를 만드는 방법은 주로 두 가지가 쓰인다. 함수 표현식 방법과 함수 선언식 방법은 함수의 이름과 호이스팅에서 차이가 있다.
example1(); // 함수 호출 (호이스팅)
function example1() {
console.log('hello');
} // 함수 선언
const example2 = function () { console.log('hello') };
// 변수 example2에 함수 할당
example2(); // 함수 호출
example2();
const example2 = function exam2 () { ... }
과 같이 함수에 이름이 지정되었다고 하더라도 변수 이름을 사용하여 함수를 호출해야한다. 함수에 이름을 정하면 코드를 디버깅 할 때 도움이 된다.개념: 끌어올림. 자바스크립트 엔진이 script 태그를 만나면 자바스크립트 파일을 먼저 쭉 읽으면서 선언된 변수와 함수를 메모리에 저장한다. 이 과정이 끝나면 코드가 위에서 부터 차례대로 실행된다.
즉 코드에서 함수나 변수를 코드의 하단부에 선언했다고 하더라도 코드의 상단부에서 함수를 호출(실행) 할 수 있는 JavaScript 만의 특징이다.
example1(); // 'hello'
example2(); // undefined
function example1(){ console.log('hello') } // 세미콜론(;) X
var example2 = function(){ console.log('hello') }; // 세미콜론 O
참고
ES6 부터 추가된 화살표 함수 표현식은 함수 표현식(익명 함수)의 단축 표현입니다.
그러나 함수 표현식과 완전히 같은 건 아니므로 주의해야 합니다. 다음과 같이 화살표 함수 표현식으로 정의한 함수를 화살표 함수라고 합니다.
const squere = function(x) { return x*x };
이를 화살표 함수 표현식으로 작성하면 다음과 같습니다.
const square = (x) => { return x*x };
함수 표현식으로 정의한 함수의 this 값은 함수를 호출할 때 결정됩니다. 메서드가 어디서 정의되었는지에 상관없이 this는 ‘점 앞의’ 객체가 무엇인가에 따라 ‘자유롭게’ 결정됩니다
그러나 화살표 함수의 this 값은 함수를 정의할 때 결정됩니다. 즉, 화살표 함수 바깥의 this 값이 화살표 함수의 this 값이 됩니다.
const obj = {
say() {
console.log(this); // [object Object]
const f = function() { console.log(this); }; // [object Window]
f();
const g = () => { console.log(this); } // [object Object]
g();
}
};
obj.say();
함수 f는 say라는 함수의 중첩 함수이며 this의 값은 전역 객체를 가리킵니다.
한편 화살표 함수 g의 this 값은 함수 g를 정의한 익명 함수의 this의 값인 객체 obj를 가리킵니다.
화살표 함수는 call이나 apply 메서드를 사용하여 this를 바꾸어 호출해도 this 값이 바뀌지 않습니다.
const f = function() { console.log(this.name); };
const g = () => { console.log(this.name); };
const tom = { name: "Tom" };
f.call(tom); // "Tom"
g.call(tom); // ""
화살표 함수 안에는 arguments 변수가 정의되어 있지 않으므로 사용할 수 없습니다.
const f = () => console.log(arguments);
f(); // ReferenceError: arguments is not defined
화살표 함수 앞에 new 연산자를 붙여서 호출할 수 없습니다.
const Person = (name, age) => { this.name = name; this.age = age };
const tom = new Person("Tom", 18); // TypeError: Person is not a constructor
화살표 함수 안에서는 yield 키워드를 사용할 수 없습니다. 따라서 화살표 함수는 제너레이터로 사용할 수 없습니다.
참조: 아소 히로시 - 모던 자바스크립트 입문(2018)
화살표 함수 다시 살펴보기(https://ko.javascript.info/arrow-functions)