> For the complete documentation index, see [llms.txt](https://leeboa.gitbook.io/study/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://leeboa.gitbook.io/study/undefined-13/undefined-10/undefined-3.md).

# 유효범위

## 유효범위

**유효범위(Scope)는 변수의 수명을 의미**

```javascript
var vscope = 'global'; //global 이라는 값을 할당 전역변수 
function fscope(){
    var vscope = 'local' ; // 지역변수
    alert(vscope);
}
fscope(); // local이 출력됨 

```

```javascript
var vscope = 'global';
function fscope(){
    var vscope = 'local';
    var lv = 'local variables';
    alert(lv); //지역변수 이기때문에 지역에서만 접근이 가능한다. 
}
fscope();
alert(lv); //undefined
```

```javascript
var vscope = 'global';
function fscope(){
    var vscope = 'local';
}
fscope();
alert(vscope);  // global
```

![](/files/-M_BIDnsNjbu-jByxkvT)

* **함수내에 var**을 쓰게되면 **지역변수**가 되기때문에 ​ 👉 **global 로 출력**이됨
* var 을 사용하지않고 **vscope = 'local'  을 쓴다면 전역변수의 값이 변하기 때문에** :point\_right: **local이 출력**된다.&#x20;

### 전역변수

함수 외부에서 선언된 변수,  👉프로그램 전체에서 접근할 수 있는 변수

### 지역변수

함수 내부에서 선언된 변수로, 함수가 실행되면 만들어지고 함수가 종료되면 소멸하는 변수  👉 함수 외부에서는 접근할 수 없

### 전역변수의 사용

```javascript
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()); //30
```

불가피하게 전역변수를 사용해야 하는 경우는 하나의 객체를 전역변수로 만들고 객체의 속성으로 변수를 관리하는 방법을 사용

### 전역변수를 사용하고 싶지 않다면 -> *익명함수*를 호출

```javascript
(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());
}())
```

### 유효범위의 대상 (함수)

:star2: **자바스크립트는 함수에 대한 유효범위만을 제공한다**. 많은 언어들이 블록(대체로 {,})에 대한 유효범위를 제공하는 것과 다른 점이다.

```javascript
for(var i = 0; i < 1; i++){
    var name = 'coding everybody';
    // for문 if문 안에서 선언된 변수는 지역변수로서의 의미를 갖지 않는다. 
}
alert(name);
```

### 정적 유효범위

**자바스크립트는 함수가 선언된 시점에서의 유효범위**를 갖는다. 이러한 유효범위의 방식을 정적 유효범위(static scoping), 혹은 렉시컬(lexical scoping)이라고 한다.

```javascript
var i = 5;
 
function a(){
    var i = 10;
    b();
}
 
function b(){
    document.write(i); 
    // 지역변수가 존재하지 않을때 전역변수를 찾게됨 
    // i -> 5 
}
 
a();
```

:star2: **사용될때가 아니고 메소드가 정의될때 전역변수가 사용되게 된다.**&#x20;
