여전히 동일합니다.
<script> <BR>var f = function g() { <BR>return 1; <BR>} <BR>if (false) { <BR>f = function g(){ <BR>return 2 ; <BR>}; <BR>alert(g()); // 2 <BR></script>
이 코드를 IE 6에 넣으면 Chrome과 완전히 다른 두 가지 효과.
여기 출력 2는 ie6에서의 효과입니다. Chrome에서는 g가 정의되지 않은 것으로 나타납니다.
이는 JScript 버그로 간주될 수 있습니다.
여기에 있는 것은 g를 정의하는 함수 표현식일 뿐이라는 것이 분명합니다. if 조건문에 포함되어 함수 표현식만 정의하고 함수는 선언하지 않습니다.
그렇다면 그런 직접 접근은 확실히 잘못된 것입니다.
그럼 문장은 무엇이고 함수표현식은 무엇인가요?
ECMAScript에서 함수를 생성하는 가장 일반적인 두 가지 방법은 함수 표현식과 함수 선언입니다. ECMA 사양에서는 한 가지 점만 명확하게 하기 때문에 둘 사이의 차이점은 약간 혼란스럽습니다. 함수 선언은 ( 식별자) (사람들이 흔히 함수 이름이라고 부르는 것), 함수 표현식에서는 이 식별자를 생략할 수 있습니다:
함수 선언:
함수 함수 이름(매개변수: 선택 사항) {함수 본문}
함수 표현식:
함수 함수명 (선택사항) (매개변수: 선택사항) {함수 본문}
그래서 함수명이 선언되지 않으면 표현식이어야 한다고 볼 수 있지만, 만약 함수 이름이 선언되었습니다. 함수 선언인지 함수 표현식인지 어떻게 확인하나요? ECMAScript는 문맥에 따라 구별됩니다. function foo(){}가 할당 표현식의 일부인 경우 이는 함수 표현식입니다. function foo(){}가 함수 본문 내에 포함되거나 프로그램 맨 위에 있는 경우입니다. 함수 선언.
덜 일반적인 함수 표현식도 있는데, 이는 괄호로 묶인 것(function foo(){})입니다. 괄호()가 그룹화 연산자이기 때문입니다. 내부에는 표현식만 포함될 수 있습니다.
JSON을 실행하기 위해 eval을 사용할 때 JSON 문자열은 일반적으로 eval('(' json ')')으로 묶여 있다고 생각할 수 있습니다. 이 괄호 쌍은 파서가 JSON 중괄호를 코드 블록 대신 표현식으로 구문 분석하도록 합니다.