전역 변수는 프로그램 내의 모든 함수와 블록에서 접근 가능하므로, 여러 함수나 모듈에서 공통으로 사용할 변수를 선언할 때 유용합니다.
예: 애플리케이션 전체에서 사용하는 설정 값이나 전역 상태 관리(예: 테마, 언어 설정 등)에 유용합니다.
let globalVariable = 'accessible everywhere';
function someFunction() {
console.log(globalVariable); // 'accessible everywhere'
}
someFunction();
다양한 함수나 코드 블록에서 동일한 데이터를 공유해야 하는 경우 전역 변수를 사용하면 간편합니다. 예를 들어, 앱의 로그인 상태나 유저 데이터를 여러 함수에서 참조하고 수정할 수 있습니다.
전역 변수를 사용하면 여러 함수에 변수를 일일이 전달하지 않아도 되므로 코드가 더 단순해질 수 있습니다. 매번 변수를 함수로 전달할 필요가 없기 때문에 코드 작성이 간편해질 수 있습니다.
여러 함수에서 동일한 전역 변수를 사용할 경우, 무심코 전역 변수의 값을 덮어쓰는 일이 발생할 수 있습니다. 이로 인해 예상치 못한 버그가 발생할 위험이 있습니다.
let globalVariable = 'initial value';
function changeValue() {
globalVariable = 'changed value'; // 전역 변수 변경
}
console.log(globalVariable); // 'initial value'
changeValue();
console.log(globalVariable); // 'changed value'
전역 변수는 코드 전체에서 변경될 수 있기 때문에, 전역 변수의 값을 추적하고 어디서 변경되었는지 파악하기 어려울 수 있습니다. 특히 코드베이스가 커질수록 디버깅이 까다로워집니다.
전역 스코프는 함수나 모듈 내에서의 독립성을 낮추기 때문에, 코드의 모듈성이 떨어질 수 있습니다. 함수가 전역 변수를 의존하게 되면, 해당 함수의 재사용성이 떨어지고 의도치 않게 외부 환경에 의존하게 됩니다.
예를 들어, 전역 변수를 의존하는 함수는 외부 상태에 따라 다르게 동작할 수 있으므로, 테스트나 리팩토링이 어려워질 수 있습니다.
전역 변수는 애플리케이션이 종료되기 전까지 메모리에 상주하기 때문에, 필요 이상으로 많은 전역 변수를 사용하면 메모리 사용량이 증가하고 성능에 영향을 미칠 수 있습니다.
특히 비동기 코드나 멀티스레드 환경에서 전역 변수를 사용할 경우, 한 곳에서 값이 변경되는 사이 다른 코드가 해당 변수에 접근할 수 있습니다. 이로 인해 값의 일관성이 깨질 수 있고, 비동기 작업이 많을수록 이러한 문제는 더 심각해질 수 있습니다.
모듈 패턴을 사용하여 전역 변수를 지역 스코프 내에 캡슐화할 수 있습니다. 이를 통해 전역 스코프 오염을 방지하고 변수를 의도한 범위 내에서만 사용하게 할 수 있습니다.
const myModule = (function() {
let privateVariable = 'This is private';
return {
getVariable: function() {
return privateVariable;
},
setVariable: function(newVal) {
privateVariable = newVal;
}
};
})();
console.log(myModule.getVariable()); // 'This is private'
myModule.setVariable('New value');
console.log(myModule.getVariable()); // 'New value'
let과 const를 사용해 변수를 블록 스코프로 제한할 수 있습니다. 이를 통해 변수의 범위를 필요한 곳에 한정시키고 전역 스코프 오염을 막을 수 있습니다.
전역 객체를 하나 만들어, 전역 변수나 함수를 여기에 할당해 전역 네임스페이스 오염을 줄이는 방법도 있습니다.
const APP = {}; // 전역 네임스페이스
APP.config = {
language: 'en',
theme: 'dark',
};
console.log(APP.config.language); // 'en'