JavaScript 전역 변수에 대한 혼란
ringa_lee
ringa_lee 2017-05-18 10:56:05
0
5
594

다음 코드:

으아악

인쇄하면 정의되지 않을 줄 알았는데.
제가 이해한 바에 따르면, b = 2는 var를 사용하지 않으므로 전역 변수를 선언합니다. 변수가 선언되었으므로 변수 선언 승격이 발생합니다. 왜 ReferenceError: b가 정의되지 않았나요?

그리고 var를 추가해 보세요:

으아악

그러면 var를 사용하고 var를 생략하는 것이 단순히 로컬 선언과 전역 선언의 차이가 아닌 것 같나요?
초보 여러분, 조언 부탁드립니다. 감사합니다!

ringa_lee
ringa_lee

ringa_lee

모든 응답(5)
刘奇

으아아아

코드 실행에는 항상 순서가 있습니다. . .

추가 사항:
직접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;분해

  1. var a를 발견하면 컴파일러는 동일한 범위의 컬렉션에 해당 이름을 가진 변수가 이미 있는지 범위에 묻습니다. 그렇다면 컴파일러는 선언을 무시하고 컴파일을 계속합니다. 그렇지 않으면 현재 범위 컬렉션에서 새 변수를 선언하고 이름을 a로 지정하도록 범위에 요청합니다.

  2. 다음으로 컴파일러는 엔진이 런타임에 실행되는 데 필요한 코드를 생성합니다. 이 코드는 a=1의 할당 작업을 처리하는 데 사용됩니다. 엔진이 실행 중일 때 먼저 현재 범위 컬렉션에 a라는 변수가 있는지 범위에 묻습니다. 그렇다면 엔진은 이 변수를 사용하고, 그렇지 않은 경우 엔진은 계속해서 변수를 찾습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿