MSDN( JScript RuntimeObject )을 사용한 디버깅에 대한 문서입니다. 이러한 예제의 대부분은 다른 브라우저에서는 작동하지 않지만 IE 5.5 이상에서는 작동합니다.
유출된 전역 식별자
예를 들어 실수로 다음과 같은 전역 속성을 생성했다고 가정해 보겠습니다.
함수 playRugby(플레이어) {
var 항목,
나;
len = 항목.길이;
// 글로벌.
}
함수 킥() {
변수 x = 10
와이 = 11;
// y를 전역으로 만듭니다.
}
playRugby가 호출되면 전역 속성 len이 생성되고, 아직 존재하지 않는 경우 items.length 값이 할당됩니다. 마찬가지로 kick이 호출되면 전역 속성 y가 생성됩니다.
이러한 전역 변수는 의도적인 것이 아닙니다. 캡슐화를 깨고 구현 세부 사항을 공개합니다. 이로 인해 충돌과 까다로운 종속성 문제가 발생할 수 있습니다.
실수로 생성된 전역 식별자를 검색하려면 전역 개체에 for in 루프를 사용할 수 있습니다. Firebug의 "DOM" 태그는 이러한 유용한 전역 감지 기능을 제공합니다.
불행하게도 IE에서는 for in이 전역 변수와 함수 선언을 열거할 수 없습니다. 다음 예를 살펴보십시오.
// 전역 변수 개체의 속성입니다.
var EX1_GLOBAL_VARIABLE = 10;
// 전역 개체의 속성입니다.
this.EX1_GLOBAL_PROPERTY = 11;
// 전역 변수 개체의 속성입니다.
함수 EX1_GLOBAL_FUNCTION(){}
(기능(){
var 결과 = [];
for(var p in this) {
결과.푸시(p);
}
Alert("유출됨:n" + results.join("n"));
})();
IE에서 결과에는 창 속성과 4개의 사용자 정의 속성인 EX1_GLOBAL_PROPERTY 중 하나의 조합이 포함됩니다.
그렇다면 나머지 세 가지 사용자 정의 속성은 어떻게 되나요? for in 루프에 표시되지 않는 이유는 무엇입니까?
전역 개체를 열거하면 할당된 전역 개체 속성이 열거되지만 전역 변수는 열거되지 않는 것으로 나타났습니다.
전역 속성은 열거할 수 있지만 전역 변수는 열거할 수 없는 이유 경험에 따르면 JScript는 전역 변수(var로 선언됨)를 DontEnum으로 표시합니다. 전역 객체는 전역 변수 객체로 정의되어 있으므로 이는 합리적인 설명처럼 보입니다. 이는 표준은 아니지만 IE의 동작을 설명합니다. 그러나 Eric Lippert는 IE에서 전역 객체와 전역 변수 객체가 서로 다른 두 객체라는 또 다른 설명을 제안했습니다.
MS-ES3에 따르면:
JScript 5.x의 변수 선언은 DontEnum 특성이 있는 전역 개체의 속성을 만듭니다.