C와 Java에는 프로그램에 대한 진입 함수나 메소드, 즉 메인 함수나 메인 메소드가 있습니다. JavaScript에서는 프로그램이 JS 소스 파일의 헤드부터 실행되기 시작합니다. 그러나 어떤 의미에서는 프로그램의 시작점으로 주요 기능을 구성할 수 있습니다. 이렇게 하면 다른 언어와 통합될 수 있을 뿐만 아니라 JS에 대한 더 깊은 이해를 갖게 될 수도 있습니다.
1. 실제 입장
JavaScript 파일이 실행을 위해 JS 엔진에 넘겨지면 JS 엔진은 모든 코드가 실행될 때까지 각 명령문을 위에서 아래로 하나씩 실행합니다.
2. 스코프 체인, 전역 범위 및 전역 개체
우리는 JS의 모든 함수가 실행될 때 새로운 범위를 생성한다는 것을 알고 있습니다. 구체적으로 말하면, 실행 프로세스가 함수에 들어갈 때 새로운 범위가 생성되고, 함수 실행이 완료되고 종료되면 이 범위가 소멸됩니다. 함수의 형식 매개변수와 지역 변수는 이 범위에 바인딩됩니다. 함수 호출이 범위 소멸을 완료하면 그에 따라 소멸됩니다. 물론, 특별한 경우, 함수가 반환될 때 범위의 일부 변수가 계속 참조되는 경우 범위와 이러한 참조된 변수는 소위 클로저를 형성하여 소멸되지 않습니다.
반면에 함수가 중첩될 수 있으므로 범위도 중첩될 수 있다는 것을 알고 있습니다. 함수가 정의되면 JS 엔진은 각 함수에 대해 외부 함수의 어휘 범위를 가리키는 [[scope]]라는 내장 속성을 설정합니다. 이러한 방식으로 여러 범위가 범위 체인이라는 체인 구조를 형성합니다. 일반적으로 언제든지 하나의 범위 체인만 있습니다. 즉, 실행 함수의 범위에서 시작하여 가장 바깥쪽 전역 범위까지 계층별로 위쪽으로 추적합니다.
[참고]: 범위 체인의 함수는 JS 소스 코드에서 계층별로 중첩된 함수입니다. 이는 함수가 실행되는 순서나 함수 호출 스택과 관련이 없습니다. 어휘 범위라는 이름의 유래.
전역 범위는 함수 범위가 아니지만 모든 함수 범위의 외부 범위이자 모든 범위 체인의 끝점입니다. 따라서 프로그램이 종료되지 않는 한 전역 범위는 항상 존재하며 전역 범위의 변수는 항상 유효합니다.
[함수 3의 범위]-->[함수 2의 범위]-->[함수 3의 범위]-->[전역 범위]
또한 전역 범위에 해당하는 전역 개체가 있습니다. 브라우저에서 전역 개체는 창 개체입니다. 전역 개체는 특수 개체입니다.
전역 범위에 정의된 변수는 전역 개체에 바인딩됩니다.
모든 범위에 정의된 변수는 var 키워드 없이 정의된 경우 전역 개체에 바인딩됩니다.
전역 범위에서 이는 전역 개체를 가리킵니다.
위에 나열된 특성을 보면 전역 범위를 객체로 간주하면 실제로는 전역 객체라는 것을 알 수 있습니다. 또한 이는 다음 네 가지 문이 전역 범위에서 동일한 이유도 설명합니다.
var a = 1; a = 1; window.a = 1; this.a = 1;
3. 가상의 주요 기능
모두 범위인데 왜 특별한 전역 범위가 필요한가요? 우리는 항상 단순성과 일관성을 선호하며 복잡성과 특수성을 피하려고 노력합니다. 그렇다면 당연히 전역 범위를 함수 범위와 동일하게 만들 수 있는지 궁금합니다. 대답은 '예'입니다. 우리는 이렇게 생각할 수 있습니다:
JS 엔진이 소스 파일을 실행할 때 파일의 코드를 main이라는 함수로 래핑한다고 가정합니다. 그런 다음 이 주 함수를 프로그램의 진입점으로 사용하십시오.
즉, JS 파일에 다음과 같은 코드가 있다고 가정해 보겠습니다.
var a = 1; var b = 2; function add(x, y) { var z = x + y; return z; } console.log(add(a, b));
JS 엔진은 프로그램이 실행되기 전에 프로그램을 주요 함수로 래핑합니다.
// 虚构的main函数 function main() { var a = 1; var b = 2; function add(x, y) { var z = x + y; return z; } console.log(add(a, b)); }
그런 다음 다음 기본 함수를 호출하세요.
main._current_scope_ = window; // 将全局作用域(对象)设为window main.call(window) // 将this指向window
4. 의미는 무엇인가요?
(1) JS에도 다른 언어와 일치하는 입력 기능인 main이 있습니다.
(2) 전역 범위의 개념이 생략되거나 전역 범위가 함수 범위가 됩니다.
(3) 위의 main 함수 호출 과정을 통해 전역 범위에서 특수 속성의 출처를 이해할 수 있습니다.
(4) 마지막 요점은 모든 JS 소스 코드를 나중에 이벤트 큐와 이벤트 루프를 위한 길을 닦는 함수로 취급하는 것입니다.
위는 편집자가 소개한 JavaScript 학습 노트(3)입니다. JavaScript에도 입구 Main 기능이 있으니 마음에 드셨으면 좋겠습니다.