자바스크립트에 정의되기 전에 함수를 사용할 수 있는 이유는 무엇입니까?
이 코드는 다른 브라우저에서도 항상 작동합니다.
function fooCheck() {
alert(internalFoo()); // We are using internalFoo() here...
return internalFoo(); // And here, even though it has not been defined...
function internalFoo() { return true; } //...until here!
}
fooCheck();
하지만 왜 그것이 작동해야 하는지에 대한 언급은 하나도 찾을 수 없었습니다.저는 이것을 존 레시그의 발표 노트에서 처음 보았지만, 언급되었을 뿐입니다.그 문제에 대한 설명은 거기에도 어디에도 없습니다.
누가 좀 가르쳐 주시겠어요?
그function
선언은 마법이며 코드 블록*의 어떤 것도 실행되기 전에 식별자가 바인딩되도록 합니다.
은 이다음포할다릅다니당과는함하는이 있는 .function
정규식 - 하향식 순서로 평가됩니다.
예를 다음과 같이 변경한 경우:
var internalFoo = function() { return true; };
작동을 멈출 것입니다.
함수 선언은 거의 동일하게 보이고 경우에 따라 모호할 수 있지만 구문적으로 함수 표현식과 상당히 별개입니다.
이는 ECMA스크립트 표준 섹션 10.1.3에 문서화되어 있습니다.안타깝게도 ECMA-262는 표준 표준으로도 읽을 수 있는 문서가 아닙니다!
포함하는 함수, 블록, 모듈 또는 스크립트.
정의하기 전에 함수를 호출(호스팅)이라고 합니다.
제가 쓰고 싶은 두 가지 기능 유형은 다음과 같습니다.
표현 함수 및 선언 함수
표현 함수:
함수 식을 변수에 저장할 수 있으므로 함수 이름이 필요하지 않습니다.또한 익명 함수(이름이 없는 함수)로 이름이 지정됩니다.
이러한 함수를 호출(호출)하려면 항상 변수 이름이 필요합니다.정의하기 전에 호출되면 이러한 종류의 함수는 작동하지 않습니다. 이는 Hoisting이 여기서 발생하지 않음을 의미합니다.우리는 항상 먼저 표현 함수를 정의한 다음 그것을 호출해야 합니다.
let lastName = function (family) { console.log("My last name is " + family); }; let x = lastName("Lopez");
다음은 ECMA스크립트 6에서 작성할 수 있는 방법입니다.
lastName = (family) => console.log("My last name is " + family); x = lastName("Lopez");
선언 기능:
다음 구문으로 선언된 함수는 즉시 실행되지 않습니다.나중에 사용할 수 있도록 저장되며 나중에 호출될 때 실행됩니다.이 유형의 함수는 정의된 위치 이전 또는 이후에 호출하면 작동합니다.정의하기 전에 선언 함수를 호출하면 호스팅이 제대로 작동합니다.
function Name(name) { console.log("My cat's name is " + name); } Name("Chloe");
리프팅 예제:
Name("Chloe"); function Name(name) { console.log("My cat's name is " + name); }
브라우저는 HTML을 처음부터 끝까지 읽고, 읽고 실행 가능한 청크(변수 선언, 함수 정의 등)로 구문 분석하면서 실행할 수 있습니다.그러나 어느 시점에서든 해당 시점 이전에 스크립트에 정의된 내용만 사용할 수 있습니다.
이것은 모든 소스 코드를 처리(컴파일)하는 다른 프로그래밍 컨텍스트와는 다릅니다. 참조를 해결해야 하는 라이브러리와 함께 코드를 연결하고 실행 모듈을 구성하여 실행을 시작합니다.
코드는 추가로 정의된 명명된 개체(변수, 기타 함수 등)를 참조할 수 있지만 모든 조각을 사용할 수 있을 때까지 참조 코드를 실행할 수 없습니다.
JavaScript에 익숙해지면 올바른 순서로 글을 써야 한다는 것을 잘 알게 될 것입니다.
개정:승인된 답변(위)을 확인하려면 Firebug를 사용하여 웹 페이지의 스크립트 섹션을 이동합니다.실제로 코드를 실행하기 전에 첫 번째 줄만 방문하여 함수에서 함수로 건너뛰는 것을 볼 수 있습니다.
일부 언어에는 사용 전에 식별자를 정의해야 하는 요구 사항이 있습니다.그 이유는 컴파일러가 소스 코드에 대한 단일 패스를 사용하기 때문입니다.
하지만 패스가 여러 개인 경우(또는 일부 체크가 연기된 경우), 그 요건 없이 완벽하게 생활할 수 있습니다.이 경우 코드를 먼저 읽고 해석한 다음 링크를 설정합니다.
저는 자바스크립트를 조금밖에 사용하지 않았습니다.이것이 도움이 될지는 모르겠지만, 지금 말씀하시는 것과 매우 유사해 보이며, 다음과 같은 통찰력을 제공할 수도 있습니다.
http://www.dustindiaz.com/javascript-function-declaration-ambiguity/
함수 "internalFoo"의 본문은 구문 분석 시간에 어딘가로 이동해야 하므로 JS 인터프리터가 코드를 읽을 때(예: 구문 분석) 함수에 대한 데이터 구조가 생성되고 이름이 할당됩니다.
나중에야 코드가 실행되고, 자바스크립트는 실제로 "internal Foo"가 존재하는지, 무엇인지, 호출할 수 있는지 등을 알아내려고 합니다.
같은 이유로 다음은 항상 다음과 같습니다.foo
글로벌 네임스페이스:
if (test condition) {
var foo;
}
언급URL : https://stackoverflow.com/questions/261599/why-can-i-use-a-function-before-its-defined-in-javascript
'programing' 카테고리의 다른 글
Ajax 요청은 쿠키 전송이 보장됩니까? (0) | 2023.08.29 |
---|---|
VS Code를 사용하여 Github에 새 프로젝트를 추가하는 방법 (0) | 2023.08.29 |
Flask 및 Ajax 게시물 HTTP 400 잘못된 요청 오류 (0) | 2023.08.29 |
안드로이드에서 "가상 키보드 표시/숨기기" 이벤트를 캡처하는 방법은 무엇입니까? (0) | 2023.08.29 |
git push: refs/heads/my/subbranch가 존재하므로 만들 수 없습니다. (0) | 2023.08.29 |