다음 코드를보십시오.
코드 사본은 다음과 같습니다.
if (! ( "aa"in window)) {
경고 ( '오 마이 신');
var aa = 1;
}
경고 (창에 "aa");
경고 (AA);
다음 질문에 답하십시오.
오류 가보고됩니까? 몇 번이나 나타날까요?
두 번째 경고가 참입니까 아니면 거짓입니까?
세 번째 경고에서 무엇이 나타나나요?
왜?
생각하고 테스트하십시오. 올바르게 대답하면 다음 기사를 읽을 필요가 없습니다.
-----------------------------
JS에서 변수를 정의하는 것은 너무 간단합니다. var를 사용할 수 있거나 var 없이도 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
var a = 1;
여기서 a는 변수 이름이고 1은 변수 값입니다. 아아, 이것은 너무 기본적입니다. 다음 코드를보십시오.
코드 사본은 다음과 같습니다.
var a;
경고 (a);
Firebug 테스트에서는 정의되지 않은 것이 나타납니다. 이것은 매우 친숙한 문자열이며 변수가 정의되지 않은 것으로 보입니다. 그러나 나는 이미 그것을 다루었다고 생각합니다. 이것은 정의이지만 가치는 첨부되지 않습니다.
정말로 정의되지 않은 일을하자 :
코드 사본은 다음과 같습니다.
경고 (a);
맞습니다. 전혀 나타나지 않은 변수를 경고하십시오. 무슨 일이 일어날까요?
Firebug는 직접 오류를보고했습니다. A는 정의되지 않았습니다. 그것은 a가 정의되지 않았 음을 의미합니다. 이전 코드를 결합하면 혼란 스럽습니다. 이 정의되지 않은이 정의되지 않은 것의 차이점은 무엇입니까?
실제로 이전 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
var a = 정의되지 않은;
경고 (a);
다시 말해, 값을 할당하지 않고 변수가 선언되면 JS는 정의되지 않은 값을 변수로 전달합니다. 이것은 "값"이며, 이는 이미 값이 있고이 값을 "정의되지 않은"이라고합니다.
직접 경고 뒤에있는 변수는 결코 나타나지 않았으며, 이는 이것이 진짜 정의되지 않았 음을 의미합니다.
간단히 말해서 : JS에는 값이없는 변수가 없으며 변수가 선언 될 때 값이 할당됩니다.
그런 다음 다음 코드를 살펴 봅니다.
코드 사본은 다음과 같습니다.
경고 (a);
var a = 1;
이 코드가 오류를보고합니까? 경고가 경고되면 변수 A가 아직 나타나지 않았기 때문입니다.
그러나 이런 식으로 오류는 없지만 정의되지 않은 값이 나타납니다. 변수 A가 이미 존재하지만 값은 우리가 원하는 것이 아니라 정의되지 않았다는 것을 나타냅니다. 문제는 무엇입니까?
var 변수 선언은 함수 선언과 동일하기 때문에 실제로 위의 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
var a;
경고 (a);
a = 1;
이런 식으로 당신은 이해할 것입니다.
따라서이 문제의 핵심은 다음과 같습니다. VAR 선언은 미리 범위의 최상위에 도달하지만 첨부 된 값은 매우 엉키지 않으면 왜 그렇게했는지 모르겠습니다. 나는 개인적으로 이것이 JS의 결함이라고 생각합니다.
현재 변수 선언을 범위 앞에 놓는 옹호자들을 고려하는 코드 습관이 있습니다. 아마도 이것을 고려할 것입니다.
이제 기사의 시작 부분에서 질문에 대한 답을 발표하겠습니다.
VAR 선언이 진행되므로 실제 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
var aa;
if (! ( "aa"in window)) {
경고 ( '오 마이 신');
aa = 1;
}
경고 (창에 "aa");
경고 (AA);
AA는 비었지만 Window에서 'AA'로 판단하면 A가 존재하고 값이 정의되지 않기 때문에 사실이 될 것입니다. 따라서 코드가 실행되지 않으면 나는 마지막 두 가지 알림에 대해서는 이야기하지 않을 것입니다.
개인적으로, 나는 이것이 매우 무의미한 질문이라고 생각합니다. 우리는 그의 이유를 이해해야하지만 그를 함정으로 멸시해야합니다.
위의 질문은 또한이 기사를 쓴 이유입니다. 온라인 기사 에서이 코드를 보았지만 그 안에는 답이 없습니다. 나는 언니를 이길 수 없어서 stackoverflow에 가서 알아 내달라고 요청했다. 대답은이 기사입니다.
그러나 이것은 실제로 매우 기본적인 질문입니다! ! !
하하, 용서해, 또 다른 질문이있다.
코드 사본은 다음과 같습니다.
var b = {}
경고 (b.aa);
경고 (b.aa.bb);
이것은 또한 변수를 선언하는 방법입니다. 그렇다면이 코드는 오류를보고합니까? 왜?