Engine --- 은 전체 JavaScript 프로그램의 컴파일 및 실행 프로세스를 처음부터 끝까지 담당합니다.
컴파일러--- 구문 분석 및 코드 생성을 담당하는 엔진의 친구입니다.
Scope --- 선언된 식별자(변수)로 구성된 일련의 쿼리를 수집 및 유지 관리하고 매우 엄격한 규칙 세트를 시행하는 엔진의 또 다른 친구가 현재 실행 중인 코드의 이러한 식별자에 대한 액세스 권한.
var a = 1; 사실 엔진은 여기에 완전히 다른 두 가지 선언이 있다고 생각합니다. 하나는 컴파일 타임에 컴파일러에 의해 처리되고, 다른 하나는 컴파일 타임에 엔진에 의해 처리됩니다. 실행 시간. var a=1;분해
var a를 발견하면 컴파일러는 동일한 범위의 컬렉션에 해당 이름을 가진 변수가 이미 있는지 범위에 묻습니다. 그렇다면 컴파일러는 선언을 무시하고 컴파일을 계속합니다. 그렇지 않으면 현재 범위 컬렉션에서 새 변수를 선언하고 이름을 a로 지정하도록 범위에 요청합니다.
다음으로 컴파일러는 엔진이 런타임에 실행되는 데 필요한 코드를 생성합니다. 이 코드는 a=1의 할당 작업을 처리하는 데 사용됩니다. 엔진이 실행 중일 때 먼저 현재 범위 컬렉션에 a라는 변수가 있는지 범위에 묻습니다. 그렇다면 엔진은 이 변수를 사용하고, 그렇지 않은 경우 엔진은 계속해서 변수를 찾습니다.
으아아아
코드 실행에는 항상 순서가 있습니다. . .
추가 사항:
직접
b = 2
这种创建全局变量的方式,其实质是变为全局对象上的一个属性,即window.b = 2
이므로 승격 또는 비승격이 없습니다. var를 사용하여 선언된 변수에는 승격 선언이 있습니다.질문을 하고 답하고 한 가지를 더 추가하세요:
mdn에서 이 문장을 찾았어요:
이 문장은 전역 변수 b가 a처럼 승격되지 않는 이유에 대한 나의 혼란을 설명합니다. a는 선언된 변수이고, b는 실행 중에만 정의되는 선언되지 않은 변수이므로 실행 전에 승격되지 않습니다.
원문: https://developer.mozilla.org...
사전에 선언하겠습니다
으아악는 컴파일러에 의해
로 해석됩니다. 으아악하지만 선언되지 않음/정의되지 않음은 승격될 가능성이 없으므로 사용하자마자 오류가 보고됩니다
이러한 범위 문제에 대해서는 "당신이 모르는 자바스크립트"(1권)를 읽어보세요. 이 문제는 모두 위에서 논의되었습니다
Engine ---
은 전체 JavaScript 프로그램의 컴파일 및 실행 프로세스를 처음부터 끝까지 담당합니다.
컴파일러---
구문 분석 및 코드 생성을 담당하는 엔진의 친구입니다.
Scope ---
선언된 식별자(변수)로 구성된 일련의 쿼리를 수집 및 유지 관리하고 매우 엄격한 규칙 세트를 시행하는 엔진의 또 다른 친구가 현재 실행 중인 코드의 이러한 식별자에 대한 액세스 권한.
var a = 1;
사실 엔진은 여기에 완전히 다른 두 가지 선언이 있다고 생각합니다. 하나는 컴파일 타임에 컴파일러에 의해 처리되고, 다른 하나는 컴파일 타임에 엔진에 의해 처리됩니다. 실행 시간.
var a=1;분해
var a를 발견하면 컴파일러는 동일한 범위의 컬렉션에 해당 이름을 가진 변수가 이미 있는지 범위에 묻습니다. 그렇다면 컴파일러는 선언을 무시하고 컴파일을 계속합니다. 그렇지 않으면 현재 범위 컬렉션에서 새 변수를 선언하고 이름을 a로 지정하도록 범위에 요청합니다.
다음으로 컴파일러는 엔진이 런타임에 실행되는 데 필요한 코드를 생성합니다. 이 코드는 a=1의 할당 작업을 처리하는 데 사용됩니다. 엔진이 실행 중일 때 먼저 현재 범위 컬렉션에 a라는 변수가 있는지 범위에 묻습니다. 그렇다면 엔진은 이 변수를 사용하고, 그렇지 않은 경우 엔진은 계속해서 변수를 찾습니다.