JavaScript

자바스크립트 객체 제어문 with 문

bang2001 2013. 8. 4. 13:53

<HTML>

<HEAD>
<TITLE> :::: 자바스크립트 객체 제어문 with 문 :::: </TITLE>

<script language="JavaScript">

document.write("안녕하세요~<br />");
document.write("만나서 반갑습니다.");

document.write("<br />-----------------------------<br />");

with(document)
{
write("안녕하세요~<br />");
write("만나서 반갑습니다.");
}

document.write("<br />-----------------------------<br />");

var array = ["영호", 100, 90, 80];

with(array)
{
document.write(join(" | ")+"<br />");
document.write(reverse().join(" . "));
}

document.write("<br />-----------------------------<br />");

var subject = [];

with(subject)
{
subject.name = "철수";
subject.kor = 70;
subject.eng = 80;
subject.math = 90;
}

for (chal_su in subject)
{
document.write(chal_su+" : "+subject[chal_su]+"<br />");
}

document.write("<br />subject로부터 파생된 전역변수 name : "+name);

</script>

</HEAD>

<BODY>
  
</BODY>
</HTML>

-----------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------

with문은 for ~ in문과 마찬가지로 객체 제어문입니다. with의 역할은 객체에 포함된 속성이나
메소드를 여러 번 사용할 때, with문을 이용하게 되면 반복적인 코드를 생략할 수 있게끔 
해주는 역할을 합니다.

위의 코드에서 document 객체에 있는 메소드인 write() 라는 메소드가 있습니다.
이 메소드를 사용하기 위해서 앞에 document 라는 객체명을 사용했는데 with() 문 안에 
인자로 document라고 적어주게 되면 write() 메소드 앞에 document를 생략할 수 있습니다.

그리고 with문을 이용하여 객체에 속성을 부여하고자 할때 위의 코드에서 3번째 방식으로도
사용할 수 있습니다. 

var subject = [];

with(subject)
{
subject.name = "철수";
subject.kor = 70;
subject.eng = 80;
subject.math = 90;
}

이 부분에서 subject 라는 배열객체를 생성하였고, 이 객체안에 name, kor, eng, math라는 속성을
부여한 것 입니다. 그리고 각 속성앞에 with를 사용했음에도 불구하고 객체명을 적어준 이유는
만약 객체명을 적어주지 않으면 각 속성은 subject 객체에 대한 속성이 아닌 일반적인 전역변수로써
작용하게 됩니다. 따라서 with문안에서 또다시 subject라는 객체명을 적어준것입니다.

그리고 이렇게 with문을 통해서 부여한 속성은 객체안에서만 작용하는 속성이 아닌,
객체의 속성과 전역변수라는 두가지 기능을 모두 가지게 됩니다. 즉 두가지 속성을 모두 가지게
되는 셈입니다. 그래서 출력문을 통해서 subject.name 이 아닌, 바로 name 으로 name라는 속성을
출력하면 "철수" 라는 문자열이 뜨게 됩니다. 

이렇게 with 문은 특정 객체의 속성이나 메소드를 사용할 때 불필요한 코드작성을 줄이는데 사용하기도 하고, 혹은 이처럼 객체의 속성을 부여할 때 사용되기도 합니다.

하지만 이 후자의 방법을 통한 객체의 속성부여는 잘 생각하고 사용하시기 바랍니다. with문을 통해 부여한 속성은 전역변수로써 작용하기 때문에 만약 중복된 변수명이 있을 경우에 예기치 못한 결과물이 나올 수 있습니다.