μƒˆμ†Œμ‹

Languages/Java Script

[Js] ν•¨μˆ˜μ§€ν–₯ | javascript ν•¨μˆ˜ | μœ νš¨λ²”μœ„ | μ§€μ—­λ³€μˆ˜ μ „μ—­λ³€μˆ˜

  • -
λ°˜μ‘ν˜•

ν•΄λ‹Ή ν¬μŠ€νŒ…μ€ "μƒν™œμ½”λ”©"의 μ΄κ³ μž‰ λ‹˜μ˜ κ°•μ˜λ₯Ό 기반으둜 올린 κ²Œμ‹œκΈ€ μž…λ‹ˆλ‹€.

상업적인 μš©λ„κ°€ μ•„λ‹Œ, 개인 곡뢀 정리 λͺ©μ μœΌλ‘œ μ˜¬λ¦¬λŠ” κΈ€μž„μ„ 미리 μ•Œλ¦½λ‹ˆλ‹€.

 

 

 


ν•¨μˆ˜μ§€ν–₯

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν•¨μˆ˜λŠ” 맀우 κ°•λ ₯ν•˜λ‹€. ν•¨μˆ˜μ— λŒ€ν•œ 이해 μ—†μ΄λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈλ₯Ό 잘 닀루기 μ–΄λ ΅λ‹€.

λ˜ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λŠ” 객체λ₯Ό μ΄ν•΄ν•˜λŠ” 데 κ°€μž₯ μ€‘μš”ν•œ 기초λ₯Ό 이룬닀. 

 

이번 κ°•μ’Œμ—μ„œλŠ” ν•¨μˆ˜ν˜• μ–Έμ–΄λ‘œμ„œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ©΄λͺ¨λ₯Ό 닀뀄보도둝 ν•˜κ² λ‹€.

 

μœ νš¨λ²”μœ„

μœ νš¨λ²”μœ„(Scope)λŠ” λ³€μˆ˜μ˜ 수λͺ…을 μ˜λ―Έν•œλ‹€. μ•„λž˜μ˜ 예제λ₯Ό 보자. 

<script>
    var vscope = 'global';
    function fscope(){
        alert(vscope);
    }
    fscope();
</script>

κ²°κ³ΌλŠ” global이닀.

 

ν•¨μˆ˜ λ°–μ—μ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ κ·Έ λ³€μˆ˜λŠ” μ „μ—­λ³€μˆ˜κ°€ λœλ‹€.

μ „μ—­λ³€μˆ˜λŠ” μ—ν”Œλ¦¬μΌ€μ΄μ…˜ μ „μ—­μ—μ„œ 접근이 κ°€λŠ₯ν•œ λ³€μˆ˜λ‹€. λ‹€μ‹œ λ§ν•΄μ„œ μ–΄λ–€ ν•¨μˆ˜ μ•ˆμ—μ„œλ„ κ·Έ λ³€μˆ˜μ— μ ‘κ·Ό ν•  수 μžˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ fscope λ‚΄μ—μ„œ vscopeλ₯Ό 호좜 ν–ˆμ„ λ•Œ ν•¨μˆ˜ λ°–μ—μ„œ μ„ μ–Έλœ vscope의 κ°’ global이 λ°˜ν™˜λœ 것이닀.

μ•„λž˜ 예제λ₯Ό 보자. κ²°κ³ΌλŠ” 'ν•¨μˆ˜μ•ˆ local'κ³Ό 'ν•¨μˆ˜λ°– global'이 좜λ ₯λœλ‹€.

 

<script>
    var vscope = 'global';
    function fscope(){
        var vscope = 'local';
        alert('ν•¨μˆ˜μ•ˆ '+vscope);
    }
    fscope();
    alert('ν•¨μˆ˜λ°– '+vscope);
</scrip>

 

즉 ν•¨μˆ˜ μ•ˆμ—μ„œ λ³€μˆ˜ vscope을 쑰회(5ν–‰) ν–ˆμ„ λ•Œ ν•¨μˆ˜ λ‚΄μ—μ„œ μ„ μ–Έν•œ μ§€μ—­λ³€μˆ˜ vscope(4ν–‰)의 값인 local이 μ‚¬μš©λ˜μ—ˆλ‹€. ν•˜μ§€λ§Œ ν•¨μˆ˜ λ°–μ—μ„œ vscopeλ₯Ό 호좜(8ν–‰) ν–ˆμ„ λ•ŒλŠ” μ „μ—­λ³€μˆ˜ vscope(2ν–‰)의 값인 global이 μ‚¬μš©λœ 것이닀.

 

즉 μ§€μ—­λ³€μˆ˜μ˜ μœ νš¨λ²”μœ„λŠ” ν•¨μˆ˜ μ•ˆμ΄κ³ , μ „μ—­λ³€μˆ˜μ˜ μœ νš¨λ²”μœ„λŠ” μ—ν”Œλ¦¬μΌ€μ΄μ…˜ 전역인데, 같은 μ΄λ¦„μ˜ μ§€μ—­λ³€μˆ˜μ™€ μ „μ—­λ³€μˆ˜κ°€ λ™μ‹œμ— μ •μ˜λ˜μ–΄ μžˆλ‹€λ©΄ μ§€μ—­λ³€μˆ˜κ°€ μš°μ„ ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

 

μ•„λž˜ 예제λ₯Ό 보자. κ²°κ³ΌλŠ” λͺ¨λ‘ local이닀.

<script>
    var vscope = 'global';
    function fscope(){
        vscope = 'local';
        alert('ν•¨μˆ˜μ•ˆ'+vscope);
    }
    fscope();
    alert('ν•¨μˆ˜λ°–'+vscope);
</script>

ν•¨μˆ˜λ°–μ—μ„œλ„ vscope의 값이 local인 μ΄μœ λŠ” λ¬΄μ—‡μΌκΉŒ?

 

그것은 ν•¨μˆ˜ fscope의 μ§€μ—­λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ varλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

varλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ μ§€μ—­λ³€μˆ˜λŠ” μ „μ—­λ³€μˆ˜κ°€ λœλ‹€.

 

λ”°λΌμ„œ 3행은 μ „μ—­λ³€μˆ˜μ˜ 값을 local둜 λ³€κ²½ν•˜κ²Œ 된 것이닀. var을 μ“°λŠ” 것과 쓰지 μ•ŠλŠ” κ²ƒμ˜ 차이λ₯Ό 이해해야 ν•œλ‹€.

 

μ „μ—­λ³€μˆ˜λŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€. μ—¬λŸ¬κ°€μ§€ 이유둜 κ·Έ 값이 변경될 수 있기 λ•Œλ¬Έμ΄λ‹€.

 

 

ν•¨μˆ˜ μ•ˆμ—μ„œ μ „μ—­λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλŠ”λ°, λˆ„κ΅°κ°€μ— μ˜ν•΄μ„œ μ „μ—­λ³€μˆ˜μ˜ 값이 λ‹¬λΌμ‘Œλ‹€λ©΄ μ–΄λ–»κ²Œ 될까?

ν•¨μˆ˜μ˜ λ™μž‘λ„ λ‹¬λΌμ§€κ²Œ λœλ‹€.
이것은 λ²„κ·Έμ˜ 원인이 λœλ‹€. λ˜ν•œ ν•¨μˆ˜λ₯Ό λ‹€λ₯Έ μ—ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ΄μ‹ν•˜λŠ”λ°λ„ 어렀움을 μ΄ˆλž˜ν•œλ‹€.

ν•¨μˆ˜μ˜ 핡심은 둜직의 μž¬ν™œμš©μ΄λΌλŠ” 점을 μƒκΈ°ν•˜μž. 

λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•ŒλŠ” κΌ­ var을 λΆ™μ΄λŠ” 것을 μŠ΅κ΄€ν™”ν•΄μ•Ό ν•œλ‹€. μ „μ—­λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 경우라면 그것을 μ‚¬μš©ν•˜λŠ” 이유λ₯Ό λͺ…ν™•νžˆ μ•Œκ³  μžˆμ„ λ•Œ μ‚¬μš©ν•˜λ„λ‘ ν•˜μž.

 

 

β–Ό 주의

더보기

β€» 이미 μ§€μ—­λ³€μˆ˜κ°€ λ§Œλ“€μ–΄μ ΈμžˆλŠ”λ°, var을 쓰지 μ•Šκ³  μ „μ—­λ³€μˆ˜λ‘œ λ§Œλ“ λ‹€λ©΄  μš°μ„ μˆœμœ„λŠ” μ§€μ—­λ³€μˆ˜κ°€ λœλ‹€.

β€» varλ₯Ό μ¨μ„œ μ „μ—­λ³€μˆ˜λ₯Ό λ§Œλ“€κ³ , 이후 varλ₯Ό μ“°μ§€μ•Šκ³  κ·Έ λ³€μˆ˜μ˜ 값을 λ°”κΎΌλ‹€λ©΄, κ·Έ 값이 μ „μ—­λ³€μˆ˜ κ°’μœΌλ‘œ λ³€κ²½λœλ‹€.

 

 

μœ νš¨λ²”μœ„μ˜ 효용

μ•„λž˜ λ‘κ°œμ˜ μ˜ˆμ œλŠ” λ³€μˆ˜ iλ₯Ό μ§€μ—­λ³€μˆ˜λ‘œ μ‚¬μš©ν–ˆμ„ λ•Œμ™€ μ „μ—­λ³€μˆ˜λ‘œ μ‚¬μš©ν–ˆμ„ λ•Œμ˜ 차이점을 보여쀀닀. μ „μ—­λ³€μˆ˜λŠ” 각기 λ‹€λ₯Έ λ‘œμ§μ—μ„œ μ‚¬μš©ν•˜λŠ” 같은 μ΄λ¦„μ˜ λ³€μˆ˜κ°’μ„ λ³€κ²½μ‹œμΌœμ„œ μ˜λ„ν•˜μ§€ μ•Šμ€ 문제λ₯Ό λ°œμƒμ‹œν‚¨λ‹€.

 

 

μ§€μ—­λ³€μˆ˜μ˜ μ‚¬μš©

<!DOCTYPE html>
<html>
<head>
	<title>haha</title>
</head>
<body>
<script type="text/javascript">
  function a(){
  	var i =0;
  }
  for(var i = 0; i <5; i++){
  	a();
  	document.write(i);
  }
</script>


</body>
</html>

 

 

μ‹€ν–‰κ²°κ³Ό

만일 μœ„ μ½”λ“œμ—μ„œ, function a 의 λ³€μˆ˜ iλ₯Ό μ„ μ–Έν•  λ•Œ, var ν‚€μ›Œλ“œλ₯Ό 적지 μ•ŠλŠ”λ‹€λ©΄ μ–΄λ–»κ²Œ 될까?

λ°”λ‘œ λ¬΄ν•œλ°˜λ³΅μœΌλ‘œ λΈŒλΌμš°μ €κ°€ λ‹€μš΄λœλ‹€.

 

κ·Έ μ΄μœ λŠ” ν˜„μž¬ forλ¬Έμ—μ„œ μ„ μ–Έλœ λ³€μˆ˜ iκ°€ μ „μ—­λ³€μˆ˜μ΄κ³ , function a의 λ³€μˆ˜ iλŠ” μ§€μ—­λ³€μˆ˜ 인데,

varν‚€μ›Œλ“œλ₯Ό 적지 μ•Šμ•„μ£Όλ©΄ aν•¨μˆ˜μ˜ λ³€μˆ˜ iκ°€ μ „μ—­λ³€μˆ˜κ°€ λ˜μ–΄,

μ „μ—­λ³€μˆ˜ i의 값이 항상 0이 λ˜μ–΄ forλ¬Έ 쑰건에 λ§Œμ‘±ν•˜λ―€λ‘œ λŠμž„μ—†μ΄ 돌게 λ˜λŠ” 것이닀.

 

 

μ „μ—­λ³€μˆ˜μ˜ μ‚¬μš©

λ³Έ μ˜ˆμ œλŠ” μœ„μ˜ μ„€λͺ…λœ 경우이며 λ¬΄ν•œλ°˜λ³΅μ„ λ°œμƒμ‹œν‚¨λ‹€. 

<!DOCTYPE html>
<html>
<head>
	<title>haha</title>
</head>
<body>
<script type="text/javascript">
  function a(){
   i =0; //varκ°€ μƒλž΅λ¨. 즉 μ „μ—­λ³€μˆ˜λ₯Ό μ˜λ―Έν•¨.
  }
  for(var i = 0; i <5; i++){
  	a();
  	document.write(i);
  }
</script>


</body>
</html>

 

λΆˆκ°€ν”Όν•˜κ²Œ μ „μ—­λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” κ²½μš°λŠ”  ν•˜λ‚˜μ˜ 객체λ₯Ό μ „μ—­λ³€μˆ˜λ‘œ λ§Œλ“€κ³  객체의 μ†μ„±μœΌλ‘œ λ³€μˆ˜λ₯Ό κ΄€λ¦¬ν•˜λŠ” 방법을 μ‚¬μš©ν•œλ‹€.

<script>
    MYAPP = {}//κ°μ²΄μž„
    MYAPP.calculator = {//κ°μ²΄μ•ˆμ— λ˜λ‹€λ₯Έ 객체
        'left' : null,//null은 값이 μ—†μŒμ„ λͺ…μ‹œν•¨
        'right' : null
    }
    MYAPP.coordinate = {
        'left' : null,
        'right' : null
    }

    MYAPP.calculator.left = 10;
    MYAPP.calculator.right = 20;
    function sum(){
        return MYAPP.calculator.left + MYAPP.calculator.right;
    }
    document.write(sum());
</script>

 

 

μ „μ—­λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜κ³  싢지 μ•Šλ‹€λ©΄ μ•„λž˜μ™€ 같이 읡λͺ…ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•¨μœΌλ‘œμ„œ μ΄λŸ¬ν•œ λͺ©μ μ„ 달성할 수 μžˆλ‹€.

<script>
    (function(){
        var MYAPP = {}
        MYAPP.calculator = {
            'left' : null,
            'right' : null
        }
        MYAPP.coordinate = {
            'left' : null,
            'right' : null
        }
        MYAPP.calculator.left = 10;
        MYAPP.calculator.right = 20;
        function sum(){
            return MYAPP.calculator.left + MYAPP.calculator.right;
        }
        document.write(sum());
    }())
</script>

 

μœ„μ™€ 같은 방법은 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ‘œμ§μ„ λͺ¨λ“ˆν™”ν•˜λŠ” 일반적인 방법이닀.

 

μ΄λ ‡κ²Œ 되면 MYAPP이 더이상 μ „μ—­λ³€μˆ˜κ°€ μ•„λ‹Œ, ν•¨μˆ˜μ— μ§€μ—­λ³€μˆ˜κ°€ λ˜λŠ” 것이닀.

λ§Œμ•½ ν•¨μˆ˜μ— 이름을 μ£Όκ³  μ‹Άλ‹€λ©΄ μ£Όκ³ , ν˜ΈμΆœν•˜μ—¬λ„ 관계가 μ—†μ§€λ§Œ κ·Έλ ‡κ²Œ 되면 κ·Έ λ˜ν•œ μ „μ—­ λ³€μˆ˜κ°€ λ˜λŠ” 것이기 λ•Œλ¬Έμ—

μ „μ—­ λ³€μˆ˜λ₯Ό ν•˜λ‚˜λ„ 쓰지 μ•Šκ³  μ‹Άλ‹€λ©΄ μœ„μ™€ 같이 읡λͺ…ν•¨μˆ˜ 방법을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

 

 

μœ νš¨λ²”μœ„μ˜ λŒ€μƒ (ν•¨μˆ˜)

 

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•¨μˆ˜μ— λŒ€ν•œ μœ νš¨λ²”μœ„λ§Œμ„ μ œκ³΅ν•œλ‹€.

λ§Žμ€ 언어듀이 블둝(λŒ€μ²΄λ‘œ {,})에 λŒ€ν•œ μœ νš¨λ²”μœ„λ₯Ό μ œκ³΅ν•˜λŠ” 것과 λ‹€λ₯Έ 점이닀. μ•„λž˜ 예제의 κ²°κ³ΌλŠ” coding everybody이닀.

<script>
    for(var i = 0; i < 1; i++){
        var name = 'coding everybody';
    }
    alert(name);
</script>

 

μžλ°”μ—μ„œλŠ” μ•„λž˜μ˜ μ½”λ“œλŠ” ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€.(μ—λŸ¬κ°€ 남)

name은 μ§€μ—­λ³€μˆ˜λ‘œ for λ¬Έ μ•ˆμ—μ„œ μ„ μ–Έ λ˜μ—ˆλŠ”λ° 이λ₯Ό forλ¬Έ λ°–μ—μ„œ ν˜ΈμΆœν•˜κ³  있기 λ•Œλ¬Έμ΄λ‹€.

for(int i = 0; i < 10; i++){
    String name = "egoing"; //var name ="egoing"κ³Ό 같은 λŠλ‚Œ
}
System.out.println(name); //console.log(name)의 λŠλ‚Œ

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ§€μ—­λ³€μˆ˜λŠ” ν•¨μˆ˜μ—μ„œλ§Œ μœ νš¨ν•˜λ‹€.

 

즉 ν•¨μˆ˜ λ°–μ—μ„œ μ‚¬μš©λ˜λŠ” μ§€μ—­λ³€μˆ˜λŠ” κ·Έ μ˜λ―Έκ°€ μ§€μ—­λ³€μˆ˜λ₯Ό κ°€λ₯΄ν‚€μ§€ μ•ŠλŠ”λ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— forλ¬Έκ³Ό 같은 κ³³μ—μ„œ μ‚¬μš© ν›„, alert(name)으둜 좜λ ₯ ν•˜μ—¬λ„ μ—λŸ¬κ°€ λ‚˜μ§€ μ•ŠλŠ”λ‹€.

 

 

정적 μœ νš¨λ²”μœ„

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν•¨μˆ˜κ°€ μ„ μ–Έλœ μ‹œμ μ—μ„œμ˜ μœ νš¨λ²”μœ„λ₯Ό κ°–λŠ”λ‹€.

μ΄λŸ¬ν•œ μœ νš¨λ²”μœ„μ˜ 방식을 정적 μœ νš¨λ²”μœ„(static scoping), ν˜Ήμ€ λ ‰μ‹œμ»¬(lexical scoping)이라고 ν•œλ‹€. 

 

<script>
    var i = 5;

    function a(){
        var i = 10;
        b();
    }

    function b(){
        document.write(i);
    }

    a();
</script>

 

 

이 μ½”λ“œμ—μ„œ function b ()μ—μ„œ 좜λ ₯λ˜λŠ” iλŠ”

κ³Όμ—°, μ „μ—­λ³€μˆ˜ i = 5의 κ°’μΌκΉŒ,  μ•„λ‹ˆλ©΄ function a()μ—μ„œ μ„ μ–Έλœ μ§€μ—­λ³€μˆ˜ i = 10 의 κ°’μΌκΉŒ?

 

정닡은 μ „μ—­λ³€μˆ˜ 5의 값이닀.

 

즉, 호좜된 μ‹œμ μ„ λ³΄λŠ” 것이 μ•„λ‹Œ (μ‚¬μš©λ  λ•Œ) μ •μ˜λ  λ•Œμ˜ μ „μ—­λ³€μˆ˜κ°€ μ‚¬μš©λ˜κ²Œ λ˜λŠ” 것이닀.

λ©”μ†Œλ“œκ°€ μ •μ˜ λ˜μ–΄μ§„ μ‹œμ μ—μ„œ μ‚¬μš©λ˜λŠ” 것, μ΄λŸ¬ν•œ λ²”μœ„λ₯Ό 정적 μœ νš¨λ²”μœ„λΌκ³  ν•œλ‹€.

λ°˜μ‘ν˜•
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.