질문하시는 분이 이렇게 물어보셔도 괜찮습니다. 그러나 이 문제는 연습을 통해 해결될 수 있다. . .
먼저 질문자는 IIFE를 작성하는 방법에 문제가 없습니다. 가장 일반적인 방법은 @ewind가 말한 내용입니다.
으아악
흔하지 않은 것들도 있습니다:
으아악
그럼 코드에 대해 이야기해 보겠습니다. 함수에서 현재 함수 이름에 값을 할당하는 경우: foo = 10; 유효하지 않습니다. (@ewind에 동의합니다. 여기서는 무시됩니다. 더 합리적인 설명이 있어야 합니다.) JS 파서는 이를 무시합니다. Chrome 콘솔에서 실행한 결과는 다음과 같습니다.
으아악
이것은 내가 위에서 말한 내용을 증명합니다무시. 그러면 IIFE는 블록 범위를 시뮬레이션하므로 외부 환경은 내부 변수에 접근할 수 없습니다. 그래서 정의되지 않았습니다.
@ewind는 foo가 익명 함수이기 때문에 어떻게 된다고 했죠? 분명히 개념이 혼란스럽습니다. foo 함수는 익명 함수가 아닙니다.
var 없이 선언된 foo는 전역 범위를 오염시키지 않기 때문에 이는 직관에 반하는 것처럼 보입니다.
하지만 함수에 선언된 변수 이름이 foo가 아니면 다음과 같이 매우 직관적입니다.
으아아아
그렇다면 함수에서 선언한 변수의 이름과 함수 이름이 같으면 왜 문제가 발생할까요? 다음 예를 볼 수 있습니다.
으아아아
즉시 실행되는 함수가 함수 이름 foo를 갖게 된 후, 호출 시의 인수.callee는 실제로 foo에 대한 참조입니다. 둘을 비교해 보면 이때 foo가 함수 객체라는 것을 알 수 있습니다. 이때 할당 작업은 적용되지 않습니다. var 선언 없이 foo 변수를 만나면 인터프리터도 이 함수 개체를 찾아 전역 범위의 오염을 방지합니다.
질문하시는 분이 이렇게 물어보셔도 괜찮습니다. 그러나 이 문제는 연습을 통해 해결될 수 있다. . .
먼저 질문자는 IIFE를 작성하는 방법에 문제가 없습니다. 가장 일반적인 방법은 @ewind가 말한 내용입니다.
으아악흔하지 않은 것들도 있습니다:
으아악그럼 코드에 대해 이야기해 보겠습니다.
으아악함수에서 현재 함수 이름에 값을 할당하는 경우:
foo = 10;
유효하지 않습니다. (@ewind에 동의합니다. 여기서는 무시됩니다. 더 합리적인 설명이 있어야 합니다.) JS 파서는 이를 무시합니다.Chrome 콘솔에서 실행한 결과는 다음과 같습니다.
이것은 내가 위에서 말한 내용을 증명합니다무시.
그러면 IIFE는 블록 범위를 시뮬레이션하므로 외부 환경은 내부 변수에 접근할 수 없습니다. 그래서 정의되지 않았습니다.
@ewind는 foo가 익명 함수이기 때문에 어떻게 된다고 했죠?
으아악분명히 개념이 혼란스럽습니다. foo 함수는 익명 함수가 아닙니다.
MDN
우선 게시된 코드가 불완전합니다. 정식 버전은 이렇습니다
으아아아var 없이 선언된 foo는 전역 범위를 오염시키지 않기 때문에 이는 직관에 반하는 것처럼 보입니다.
하지만 함수에 선언된 변수 이름이 foo가 아니면 다음과 같이 매우 직관적입니다.
으아아아그렇다면 함수에서 선언한 변수의 이름과 함수 이름이 같으면 왜 문제가 발생할까요? 다음 예를 볼 수 있습니다.
으아아아즉시 실행되는 함수가 함수 이름 foo를 갖게 된 후, 호출 시의 인수.callee는 실제로 foo에 대한 참조입니다. 둘을 비교해 보면 이때 foo가 함수 객체라는 것을 알 수 있습니다. 이때 할당 작업은 적용되지 않습니다. var 선언 없이 foo 변수를 만나면 인터프리터도 이 함수 개체를 찾아 전역 범위의 오염을 방지합니다.