익명 함수 표현식의 경우 함수는 익명입니다 . 말 그대로 이름이 없습니다. 할당하려는 변수에는 이름이 있지만 함수에는 없습니다. (업데이트 : 그것은 ES5를 통해 사실이었습니다. ES2015 [일명 ES6]부터, 종종 익명의 표현으로 생성 된 함수는 실제 이름을 얻습니다 [그러나 자동 식별자는 아닙니다], 계속 읽으십시오 ...)
이름이 유용합니다. 이름은 스택 추적, 호출 스택, 중단 점 목록 등에서 볼 수 있습니다. Names are a Good Thing ™.
(이전 버전의 IE [IE8 이하]에서 명명 된 함수 표현식을주의해야했습니다. 두 개의 완전히 별개의 함수 객체를 완전히 다른 두 시간에 실수로 만들었 기 때문입니다 [더 자세한 내용은 내 블로그 기사 Double take ]. IE8 [!!]을 지원합니다. 익명의 함수 표현식이나 함수 선언 을 고수하는 것이 가장 좋지만 명명 된 함수 표현식은 피하십시오.)
명명 된 함수 표현식에 대한 한 가지 중요한 점은 함수 본문 내에서 해당 함수 이름으로 범위 내 식별자를 생성한다는 것입니다.
var x = function example() {
console.log(typeof example); // "function"
};
x();
console.log(typeof example); // "undefined"
하지만 ES2015에서 많은 "익명"함수 표현식은 이름이있는 함수를 생성하며, 이는 컨텍스트에서 이름을 추론하는 데 매우 똑똑한 다양한 최신 JavaScript 엔진에 의해 선행되었습니다. ES2015에서 익명 함수 표현식은 이름이 boo
. 그러나 ES2015 + 의미 체계를 사용하더라도 자동 식별자는 생성되지 않습니다.
var obj = {
x: function() {
console.log(typeof x); // "undefined"
console.log(obj.x.name); // "x"
},
y: function y() {
console.log(typeof y); // "function"
console.log(obj.y.name); // "y"
}
};
obj.x();
obj.y();
함수 이름에 대한 할당 은 사양의 다양한 작업에 사용되는 SetFunctionName 추상 작업으로 수행됩니다.
짧은 버전은 기본적으로 다음과 같이 할당 또는 초기화와 같은 것의 오른쪽에 익명 함수 표현식이 나타날 때마다 발생합니다.
var boo = function() { /*...*/ };
(또는 때문일 수 있습니다 let
또는 const
보다는 var
) , 또는
var obj = {
boo: function() { /*...*/ }
};
또는
doSomething({
boo: function() { /*...*/ }
});
(마지막 두 개는 실제로 동일한 것입니다) , 결과 함수는 이름을 갖게됩니다 ( boo
예에서).
중요하고 의도적 인 예외가 있습니다. 기존 개체의 속성에 할당 :
obj.boo = function() { /*...*/ }; // <== Does not get a name
이는 새로운 기능이 추가되는 과정에서 제기 된 정보 유출 우려 때문이었습니다. 여기 에 다른 질문에 대한 내 답변의 세부 사항 .