본문 바로가기

WEB&서버

[WEB] 웹 상의 전역변수 length

최근 자료구조를 공부하면서 타입스크립트로 자료구조를 구현해보고 있다. 힙을 구현해보는 과정에서 현재 힙의 크기를 length라는 이름으로 지정했는데, 분명 타입 문제가 없음에도 불구하고 어디선가 오류가 발생해서 힙 정렬이 제대로 동작하지 않는 문제가 있었다. 구현된 내용은 vite을 이용하여 웹 콘솔에서 출력했다.

 당시 코드의 일부는 다음과 같다.

export class ABHeap<HElem> {
    /**
     * priority: val1 > val2 를 반환하는 비교 함수
     */
    protected comp: Predicate<HElem>;
    list: HElem[];
    protected readonly maxLen: number;
    protected length: number = 0;
    //...
    delete() {
        if (this.isEmpty) {
            throw new Error("heap is empty");
        }

        const result = this.list[0]; // 첫번째 데이터 -> 반환
        this.length--; // 인덱스 0 기준이라, 마지막 데이터는 length - 1 위치에 존재.
        const last_data = this.list[this.length]; // 마지막 데이터 -> 비교하면서 삽입.
        this.list[length] = result;
    //....

 문제가 발생한 부분은 현재 코드에서 마지막 줄 부분으로, this를 빼먹은 것이 문제였다. 이 문제는 발견하기 까다로운데, 자바스크립트 및 타입스크립트를 사용하는 경우 IDE 상에서 length 전역변수를 자동완성으로 지원해주기 때문이다. 정확히 말하자면 웹 프론트 개발 환경에서 존재하는 변수로, node 같은 백엔드 환경에는 없다.

length가 var 변수로 선언되어 있는 모습

  그렇다면 length 전역 변수는 어디에 사용될까?


window.length

https://developer.mozilla.org/ko/docs/Web/API/Window/length

 

Window.length - Web API | MDN

window의 frame 개수를 반환합니다. (<frame> 또는 <iframe> 요소들 중 하나)

developer.mozilla.org

 웹 상에서 length 변수는 화면과 관련된 정보를 가지고 있는 객체의 프로퍼티 중 하나로, 현재 화면 내의 frame 또는 iframe의 개수를 의미한다. iframe은 현재 문서에 다른 html 문서를 삽입할 때 사용하는 태그 중 하나로, 유튜브 영상 등 외부 API을 페이지에 둘 때 사용된다.

 window.length 프로퍼티를 length 라는 이름으로 사용할 수 있는 것은 웹 환경의 특징 때문이다. 웹 환경에서 var로 변수를 선언하면 window 객체와 자동으로 연결된다. 다음 예시를 보자.

웹 환경에서 여러 변수를 선언하고 출력해본 모습

 my_apple 및 my_ball은 var 변수로 선언했지만 window 객체로 접근이 가능했다. 반대로 window 객체의 프로퍼티로 선언한 my_cat은 단순히 my_cat으로 접근이 가능하다. 이 예시에서 볼 수 있듯이 웹 환경에서 window 객체는 전역객체로 동작하기 때문에 변수를 var로 선언하는 경우 window 객체에 등록된다. 따라서 window.length 역시 단순히 length로 접근할 수 있는 것이다.

https://www.w3schools.com/jsref/prop_win_length.asp

 

Window length Property

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 w3schools에서 length 기반으로 현재 페이지 상의 프레임들을 의미하는 frames을 순회하는 예제를 제시한다. 다만 실제로 프레임 전체에 대한 처리가 필요한 경우가 있을지는 잘 모르겠다.


결론

 프론트엔드 환경에서 전역변수 length는 window.length로, 현재 페이지 상의 iframe 등 삽입되는 html 요소의 개수를 의미한다. 프레임들은 for문 및 window.frames[ ] 을 통해 순차 접근이 가능하다.

 이처럼 window.length는 웹 환경에서 의미를 가지고 미리 선언된 변수이므로, 프론트엔드 코드를 작성할 때 length 변수를 전역(var)으로 선언해서 덮어쓰지 않도록 조심하자.

'WEB&서버' 카테고리의 다른 글

[WEB] console.log로 객체를 출력하지 말자  (0) 2023.02.07
브라우저 동작 관련 읽어볼만한 내용들  (0) 2023.02.07
[WEB] 데이터 속성  (0) 2023.01.25
[웹 스크래핑] 셀레니움 사용법  (0) 2022.05.01
SSH  (0) 2022.04.14