# 유효범위

## 유효범위

**유효범위(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;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://leeboa.gitbook.io/study/undefined-13/undefined-10/undefined-3.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
