작성 이유 :
일반적으로 js에서 함수를 작성할 때 일반적으로 function fn(){}이라는 기존 방식으로 함수를 선언합니다. 몇몇 훌륭한 플러그인을 읽을 때 필연적으로 var fn = function() {}이 무엇인지 보게 됩니다. 오늘은 캐서롤을 깨고 질문을 던지는 정신으로 이 매혹적인 함수 선언에 대해 이야기해 보겠습니다.
함수 선언
함수 선언 샘플 코드
이렇게 fn이라는 함수를 선언했는데, 이 함수 위에 호출하면 실행될 것 같나요? 아니면 오류가 보고되나요?
fn(); // 앞서 선언한 fn 함수를 호출합니다
콘솔 출력:
네, 이때 fn 함수를 호출할 수 있습니다. 이유를 요약하면 다음과 같습니다.
요약:
1: 이때 fn 함수는 변수의 결과로, 기본적으로 전역 컨텍스트의 변수에 저장됩니다(window.function 이름으로 확인 가능)
2: 이 메소드는 전역 컨텍스트 단계에 들어갈 때 생성되는 함수 선언입니다. 코드 실행 단계에서 이미 사용 가능합니다. ps: 자바스크립트는 메소드에 들어갈 때마다 컨텍스트 환경(글로벌 → 로컬)을 초기화합니다
3: 변수 객체에 영향을 미칠 수 있음(컨텍스트에 저장된 변수만 해당)
함수 표현
함수 표현 예시 코드
그러면 익명 함수를 선언하고 그 참조가 fn 변수를 가리키도록 할까요?
위와 아래에서 다시 한번 표현식으로 선언한 함수를 호출하면 콘솔에 출력되는 모습을 볼 수 있습니다.
콘솔 인쇄 결과:
코드가 실행되고 fn() 함수가 처음 호출되면 다음 메시지가 표시되고, fn은 함수가 아닙니다(fn은 메서드가 아닙니다). 오류가 발생하면 작업이 종료됩니다. 마주쳤다.
이는 fn()이 처음 호출되었을 때 var fn 변수가 전역 객체의 속성으로 존재하지 않고, fn이 참조하는 익명 함수 컨텍스트가 초기화되지 않아 이전 호출이 실패했음을 보여줍니다. .
콘솔 인쇄 결과:
표현식 함수 이후에 호출이 가능하다고 볼 수 있는 이유를 정리해볼까요?
요약:
1: 우선 변수 자체가 함수로 존재하는 것이 아니라 익명 함수에 대한 참조입니다(값 유형은 참조가 아닙니다)
2: 코드 실행 단계에서 전역 컨텍스트가 초기화되면 전역 속성으로 존재하지 않으므로 변수 객체의 오염이 발생하지 않습니다
3: 이 유형의 선언은 일반적으로 플러그인 개발에서 일반적이며 클로저에서 콜백 함수에 대한 호출로 사용될 수도 있습니다
따라서 function fn () {}은 var fn = function () {}과 동일하지 않으며 본질적으로 다릅니다.