For Programmer

자바스크립트 -전역변수와 지역변수(var사용:ES5문법) 본문

Programming language/JavaScript

자바스크립트 -전역변수와 지역변수(var사용:ES5문법)

유지광이 2020. 7. 18. 17:46
728x90

*참고로 ES6에서는 var대신에 const,let을 사용합니다. var는 es6에서는 더이상 쓰이지 않습니다.

전역변수와 지역변수의 차이

*함수밖에서 선언한 var 변수는 전역변수라고 보면되고 함수내부에서 선언한 var변수는 지역변수이다. 참고로 다른 언어와달리 var는 선언된 함수내에서 유효범위를 가진다.

*var 은 변수의 선언에 사용된다. var를 생략할시 이미 선언되어 있는 변수를 값을 참조하는데 지역변수내에 해당 변수가있을경우 지역변수의 값을 참조하고 지역변수가 없을경우 전역변수의 값을 참조한다.

변수를 선언하지 않고 참조할때 발생할 수있는문제

 

*a함수내에서 var 로 변수선언을 하지않을 경우 a함수에서 i는 전역변수 i를 가리키게된다. 그러나 a가 for문 내부로 들어가게 될경우 가장가까운 i 즉 for문 내에서 선언부분에 있는 var i = 0 을가리키게 되기 때문에 i는 계속해서 0으로 초기화 된다

var 변수의 유효범위

* 다른언어와 달리 javascript는 같은함수내에 있으면 var로 선언되었을 경우 해당변수를 모두 공유할 수있다. 단 함수를 나가게되면 밖에서는 참조할 수 없다. (웬만한 언어들은 { } 중괄호 내에서만 변수의 유효범위를 가짐) - ES6에서는 이러한 문제점을 해결하기위해 const,let 변수 사용

 

Lexical scoping(정적유효범위)

* 정적유효범위: b함수는 런타임될때 i가 정의되는 것이 아닌 컴파일 때 i가 정의 되기 때문에 i는 전역함수로 선언이 되었다. 따라서 b함수내의 i는 5를 가리키게된다. a함수를 호출하면 10이아닌 5가 출력이 되는데(java 언어에서도 똑같이 작동) 이것은 호이스팅 차이때문이다.

*참고:전역변수 문제를 해결해주는 방법:익명함수의 사용

*실제로 전역변수사용을 허용하지 않기 위해 코드를 작성 후 코드 일부분을 익명함수 function으로 감싸고 그것을 ( ) 소괄호로 묶어주는 방식을 많이 사용한다. 이 경우 함수내에서 변수를 선언하게 됨으로써 선언한 함수이름과 변수는 모두 지역변수가된다.

 

728x90
Comments