로 구문 분석되고 있기 때문에 작동하지 않으며 FunctionDeclaration
함수 선언의 이름 식별자는 필수 입니다.
괄호로 묶으면로 평가되며 FunctionExpression
함수 표현식의 이름을 지정할 수 있습니다.
문법은 FunctionDeclaration
다음과 같습니다.
function Identifier ( FormalParameterListopt ) { FunctionBody }
그리고 FunctionExpression
s :
function Identifieropt ( FormalParameterListopt ) { FunctionBody }
보시다시피 Identifier
(Identifier opt ) 토큰 FunctionExpression
은 선택 사항이므로 이름을 정의하지 않고 함수 표현식을 가질 수 있습니다.
(function () {
alert(2 + 2);
}());
또는 명명 된 함수 표현식 :
(function foo() {
alert(2 + 2);
}());
괄호 (공식적으로 그룹화 연산자 라고 함 )는 표현식 만 둘러 쌀 수 있으며 함수 표현식이 평가됩니다.
두 개의 문법 제작은 모호 할 수 있으며 다음과 같이 정확하게 똑같이 보일 수 있습니다.
function foo () {} // FunctionDeclaration
0,function foo () {} // FunctionExpression
구문 분석기는 표시 되는 컨텍스트 에 따라 a FunctionDeclaration
또는 a 인지 알고 있습니다.FunctionExpression
위의 예에서 쉼표 연산자 는 표현식 만 처리 할 수 있으므로 두 번째 표현식은 표현식입니다.
반면에, FunctionDeclaration
s는 실제로 " Program
"코드, 즉 전역 범위 외부 및 FunctionBody
다른 함수 내부의 코드를 의미하는 코드 에만 나타날 수 있습니다.
블록 내부의 함수는 다음과 같은 예기치 않은 동작을 유발할 수 있으므로 피해야합니다.
if (true) {
function foo() {
alert('true');
}
} else {
function foo() {
alert('false!');
}
}
foo(); // true? false? why?
위의 코드는 실제로 명령문을 포함 할 수 SyntaxError
있기 때문에 실제로는을 생성해야 Block
하지만 ECMAScript 사양은 함수 명령문을 정의하지 않습니다. 그러나 대부분의 구현은 허용되며 두 번째 함수 인 간단하게 경고합니다 'false!'
.
Mozilla 구현 (Rhino, SpiderMonkey)은 다른 동작을합니다. 이들의 문법에는 비표준 함수 명령문이 포함되어 있습니다. 이는 함수가 s에서 발생하는 구문 분석 시간이 아니라 런타임에 평가됨을 의미합니다 FunctionDeclaration
. 이러한 구현에서 첫 번째 함수가 정의됩니다.
함수는 다른 방식으로 선언 될 수 있으며 다음을 비교하십시오 .
1- 변수에 곱한 함수 생성자로 정의 된 함수 곱하기 :
var multiply = new Function("x", "y", "return x * y;");
2- multiply 라는 함수의 함수 선언 :
function multiply(x, y) {
return x * y;
}
3- 변수에 곱한 함수 표현식 :
var multiply = function (x, y) {
return x * y;
};
4- 변수에 곱하는 명명 된 함수 표현식 func_name :
var multiply = function func_name(x, y) {
return x * y;
};