공부/JavaScript

Variable 선언과 적용범위

726582776982 2022. 6. 6. 18:19
** Variable 선언과 적용범위 ***
1. 선언
 
1.1) 변수
=> var : 재선언가능, 재할당가능
=> let : 재선언불가능, 재할당가능
 
1.2) 상수
=> const : 재선언불가능, 재할당불가능
 
1.3) 묵시적 정의 ( var, let, const 없이 정의 )
=> 전역변수의 경우
=> 차이점
delete 가 적용됨 (변수와 값이 메모리에서 삭제됨)
명시적 선언시에는 delete가 적용되지않고, 변수와 값이 메모리에 보존됨
 
1.4) delete
=> 변수의 정의를 취소함
=> var, let, const 로 정의한 변수에는 적용되지 않고,
정의없이(묵시적으로) 사용한 변수에만 적용됨.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// 1.1) var : 재선언가능, 재할당가능
        var x= 100; x='대한민국'; x=123.456;
        var x = 'Korea';
        document.write('var x => '+x);
 
// 1.2) let : 재선언불가능, 재할당가능  
        let y= 123; y='홍길동'; y=123.456;
        // => 파싱단계에서 오류 : script 모두 실행 안됨
        //    Identifier 'y' has already been declared
        document.write('let y = '+y+"<br>");
 
// 1.3) const : 재선언불가능, 재할당불가능
        // => 전체 대문자로
        const PI = 3.141592;
        // ** 재선언   
        // => 파싱단계에서 오류 : script 모두 실행 안됨 
        //    Identifier 'PI' has already been declared 
        //const PI = '초코파이';
        
// ** 재할당
        // => 실행시 오류
        //    Assignment to constant variable.
        //PI = '초코파이';
        document.write('const PI => '+PI+'<br>');
 
// 1.4) delete
        // => 묵시적 변수, 배열의 원소, 객체의 속성(프로퍼티) 등을 삭제할 수 있음. 
        // => var, let, const 로 정의한 변수에는 적용되지 않고,
        //     정의없이(묵시적으로) 사용한 변수에만 적용됨.
        // => 삭제를 하면 true를 반환, 아니면 false를 반환
        //     존재하지 않는 속성을 delete 하면 delete는 어떠한 작업도 없이 true를 반환   
        delete(x); delete(y); delete(PI);
        document.write("delete 확인 x,y,PI => "+x+y+PI+'<Br>');
            // Error 없고 delete 만안될뿐 -> false 등 return 임
        name = "홍길동";
        document.write(`before => ${name<br>`);
        document.write(`delete => ${delete(name)}<br>`);
        //document.write(`after => ${name}`); // error -> name is not defined;
        // null 값 할당과 delete 비교 
        addr = "Korea";
        document.write("before "+addr+"<br>");
        addr = null;
        document.write("after "+addr+"<br>");
        x = null; y = null;
        //PI = null ; Assignment to constant variable;
        document.write(`null 적용 확인 => ${x}${y}${PI} <br>`);
        var arr = ["가","나","다","라","마"];
        document.write("before 배열 => ");
        for(var i of arr){
            document.write(i+' ')
        }
        delete arr[2];
        document.write("<br>");
        document.write("after 배열 => ");
        for(var i of arr){
            document.write(i+' ')
        }
        document.write("<br>");
        // *** 객체의 프로퍼티 delete Test
        var student={
            name'홍길동',
            score: 100,
            study:function() {
                return "***  Test delete Object Method ***<br>";
            }
        }//student
        delete student.score;
        delete student.study;
        document.write(`after delete student.score => ${student.score}<br>`); // undefined
        document.write(`after delete student.study => ${student.study}<br>`); // undefined
        //document.write(`after delete student.study => ${student.study()}<br>`); 
                                            // error -> student.study is not a function 
// 2. Variable 적용범위
        // 2.1) 전역변수 : 현재스크립트 내의 어디서든 사용가능   
        var sum = 100;
        var name = "홍길동";  // 명시
        addr = "경기도 성남시"// 묵시
        document.write(`전역변수 Test => ${sum},${name},${addr}<br>`);
        //test(); // 실행안됨
        const test = (count) => {
            var name = "명시적 지역";
            var id = "banana";
            company = "그린학원";
            // ** 묵시적 지역변수
            // => 일단 실행되어 값이 할당되면, 전역으로 사용됨.
            // => 이러한 변수는 전역에서만 사용할 것을 권장하고, 
            //    지역변수는 명시적으로 선언후 사용할 것을 권장함.
            document.write(`전역변수_Function 내부 => ${sum},${name},${addr} <br>`);
            document.write(`지역변수_Function 내부 => ${name},${id},${company} <br>`);
            // ** 변수명이 동일한경우 전역변수 접근
            // => this 또는 window 로 접근
            // => 이 외에도 전역객체를 가리키는 식별자는 self, frames, global 등
            //    이 있으나, ECMA11 (ES11) 에서는 globalThis 로 통일됨. 
            document.write(`function 전역변수 , 지역변수 구별 =>  ${this.name}, ${window.name},${name},${id}, ${company} <br>`);
            sum = 0;
            // ** 반복자로 정의된 변수
            // => function 에 종속된 지역변수
            for(var i=0; i<count; i++){
                sum += i;
            }
            document.write(`**After_for_sum => ${sum},${i}<br>`);
        }
        test(5);
        document.write(`지역변수_Function 외부 => ${name},${company} <br>`);
        //document.write(`** Test의 매개변수 Count = > ${count}<br>`);
        //document.write(`** Test의 매개변수 id = > ${id} <Br>`);
cs