Javascript에서는 전역 환경 자체가 객체입니다. 브라우저 호스트에서는 이 객체가 window이지만, 임베디드 환경 등 브라우저가 아닌 다른 호스트에서 Javascript를 사용하는 경우에는 다른 객체일 수 있습니다.
또한 여기서 개념을 수정하고 싶습니다. 많은 사람들은 Javascript가 브라우저에서만 사용된다고 생각합니다. 실제로 Javascript는 웹이 아닌 여러 상황에서도 사용할 수 있다고 합니다. 임베디드 기반 응용분야. 물론 이런 전설만 들어봤을 뿐입니다.
주제로 돌아가서 var i=1이라고 쓰면 실제로 창 범위에서 변수를 선언하는 것입니다.
i=1이라고 쓰면 창 속성을 선언합니다.
이 코드를 보세요:
]
이것은 코드가 따로 출력됩니다. 결과는 undefine world, Welcome china, hello china입니다.
따로 설명하자면:
위에서 Javascript를 미리 컴파일하면 모든 var 변수가 생성되고 기본값이 생성된다고 했습니다. 값이 정의되지 않았습니다. 예를 들면 다음과 같습니다.
다음과 같은 코드를 작성할 수 있습니다.
외부 J를 도입해야 하는 경우 실행하려면 새로 고쳐야 합니다.
]
[Ctrl A 모두 선택 참고:
외부 J를 도입해야 하는 경우 실행하려면 새로 고쳐야 합니다.
]
다음에 이야기하겠습니다. 함수 범위의 문제 코드가 함수로 실행될 때마다 Javascript 엔진은 자동으로 새 범위를 생성한 다음 이 새 범위를 현재 범위의 하위 범위로 사용하고 현재 코드를 전환합니다. 이 새로운 범위에 적용됩니다. 코드가 함수를 종료하면 이 범위가 삭제되고 코드 범위가 상위 범위로 반환됩니다.
자, 준비가 거의 완료되었습니다. 다음으로 첫 번째 질문인 정의되지 않은 세계가 출력되는 이유를 설명하겠습니다.
먼저 코드가 미리 컴파일되어 Test 메서드에 들어가면 새 범위가 열리고 전역 범위가 상위 범위로 사용됩니다. 그런 다음 Test에서 메서드를 미리 컴파일합니다. 위 코드와 마찬가지로 Test 메서드가 미리 컴파일된 후의 메서드 본문은 대략 다음과 같습니다. 코드 복사
코드는 다음과 같습니다.
function Test() {
var a = undefine;
alert(a " " b)
var a = "welcome" ;
b = "china";
alert(a " " b);
}
물론 b는 현재 범위에서 찾을 수 없습니다. 그의 b="world"는 상위 범위, 즉 전역 범위에서 발견됩니다. 그래서 이런 결과가 나왔습니다.
웰컴차이나가 두 번째로 뜨는데 할 말이 없습니다.
[Ctrl A 모두 선택 참고: 외부 J를 도입해야 하는 경우 실행하려면 새로 고쳐야 합니다 ]
首先,我们将方法体内的var a改成a,我们先不看答案,直接来分析,首先,在预编译阶段,方法体内几乎没有任何改变,因此此时a和b一样,都要去他们的父作用域中去寻找,因此第一次出的结果应该是hello world,第二次没什么说的:welcome china,第三次由于a和b在本作用域内都没有事先定义,因此都是再改变父作用域内的值,因此应该输出welcome china.
我们继续:
和上面的分析一样,应该输出undefined undefined,welcome china,hello world.
继续:
应该是undefined world,welcome china,hello china.
经试验,都没问题, 不知道你明白了么?
因此我们可以得出,每个变量在找不到自己的定义时,都会沿着作用链向上寻找,这样就很可能会出现未预知的错误,给排错添加了很多困难。更麻烦的是,还可能会对父作用域上的变量值进行修改,因此我们在声明变量时应该尽量加上var,尽管Javascript并不强迫我们这样做。