JavaScript 변수 사용
ES2015 (ES6) 릴리스 이전에는var
키워드를 사용하여 자바스크립트 변수를 선언했습니다. 하지만 ES6의let
도입과 함께 변수를 선언하는 새로운 방법으로const
추가되었습니다. 이것은 어떤 키워드를 언제 사용해야 하는지에 대한 질문을 자주 제기합니다.
다음은 JavaScript에서 변수를 선언하는 다양한 방법에 대한 간단한 설명입니다.
변수 사용
var
사용은 JavaScript에서 가장 오래된 변수 선언 방법입니다. 함수 내에서 정의되는 경우var
any는 해당 함수로 제한되지만 함수 외부에서 정의하면var
a는 전역 함수로 제한됩니다.
// Global Declaration
var variable = value;
const varExampleFunction = () => {
// Local Declaration
var variable = value;
}
let 사용
let
선언은 ES6에서 도입되었으며, 이 유형의 선언은 블록 범위가 지정되므로 로 선언된 변수는 해당 선언이 정의된 블록 또는 함수에서만 액세스할let
수 있습니다.
const letExampleFunction = () => {
let variable = value;
}
const 사용
let
As const
는 ES6에서도 도입되었습니다. 이것이 두 선언이 매우 유사한 이유입니다. 가장 큰 차이점은 상수 값을 보유하는 메모리의 데이터를const
가리키며const
참조 변수를 메모리의 다른 객체에 재할당할 수 없다는 것입니다.
const constExampleFunction = () => {
const variable = value;
}
범위 충돌
JavaScript에서var
, let
또는const
요소를 사용하여 변수를 정의하면 해당 변수가 정의된 함수 내에서 범위가 지정됩니다. 전역 변수는 페이지의 다른 스크립트와의 충돌에 취약합니다.
의 코드 예제를 살펴 보자. 다음 코드에서는 함수와 변수가 페이지 범위 내에 존재합니다.
// script 1
const incrementCount = () => {
count++;
}
const myButton = document.getElementById('buttonId');
let count = 0;
myButton.onclick = incrementCount;
이제 스크립트 외부에 글로벌count
변수도 수정하는 함수가 있다고 가정해 보겠습니다. 이러한 스크립트 충돌로 인해 예기치 않은 결과가 발생할 수 있습니다.
// script 2
const countVideos = videoList => {
count = videoList.length;
}
결과:
- 사용자가
myButton
버튼을 두 번 선택하여count
변수를 증가시킵니다script 1
.count
= 2
countvideos
함수는 웹 페이지에Script 2
있지만 웹 페이지에도 있는 함수가 호출됩니다. 에videoList
10개의 항목이 있다고 가정해 보겠습니다. 이제count
글로벌 변수의 값은 10입니다.count
= 10
- 다음에 사용자가
myButton
버튼을 선택하면count
변수가 예상치 못한 결과를 반환합니다.- 예상:
count
= 3 - 실제:
count
= 11
- 예상:
스크립트에서 충돌을 피하려고 할 수 있지만 페이지에 포함된 타사 스크립트가 유사한 함수 및 변수 이름을 사용하지 않는다는 보장은 없습니다.
익명 함수
한 가지 해결책은 코드를 익명의 함수 (클로저라고도 함) 로 래핑하여 즉시 실행되는 것입니다. 클로저 내의 코드는 다른 스크립트에서 액세스 할 수 없습니다. 따라서 개인 함수와 변수를 만드는 방법을 제공합니다.
여기에 익명 함수의 구문은 다음과 같습니다
- 3 행: 다른 코드가 함수를 호출 할 때까지 기다리는 대신 파싱 된 후 즉시 함수를 실행하도록 JavaScript에 지시하는 추가 괄호 집합이 포함됩니다.
( () => {
// your code
}());
다른 구문 예:
var res = function( [arguments] ) { ... }
클로저는 응용 프로그램의 수명 기간 동안 개인 정보 보호 및 상태를 제공하므로 강력해질 수 있습니다. 클로저 내부의 코드의 경우 모든 변수와 함수는 클로저 범위에만 있습니다. 그러나 클로저 내부의 코드는 여전히 전역 변수 나 함수에 액세스 할 수 있습니다.
전역
JavaScript에는 암시적 전역이라는 기능이 있지만 전역 변수를 확인하는 것은 쉽지 않으므로 코드를 관리하기가 어려울 수 있습니다. 변수가 글로벌 변수인지 확인하려면 인터프리터가 스코프 체인을 거꾸로 돌아다니며 이름과 일치하는var
명령문을 찾아야 합니다. 아무 것도 발견되지 않으면 변수는 전역 변수로 간주됩니다.
전역 전달
익명 함수를 사용하면 전역 매개 변수를 명시 적으로 전달할 수 있습니다. 이를 코드로 매개 변수 가져 오기라고합니다.
다음은 예입니다.
- 행 1: 함수에 전달되는 매개 변수의 이름을 정의합니다. 3 행의 이름과 일치 할 필요가 없습니다. 여기서
window
객체는 라는 매개 변수로window1
전달됩니다. - 3행:
window
객체를 함수로 전달합니다.
( ( window1, undefined ) => {
...
})(window);
전달되는 객체는 1개뿐이지만 매개 변수는 두 개이므로 의 값은undefined
정의되지 않습니다.
typeof undefined == "undefined"
다른 변수가 정의되어 있는지 쉽게 확인할 수있는 방법을 원한다면 유용 할 수 있습니다.
if(variable1 === undefined)
전역 내보내기
익명 함수 외부에서 변수와 함수를 전달할 수도 있습니다. return
값을 사용하여 이 작업을 수행할 수 있습니다.
다음은 예입니다.
- 1행: 익명 함수를 에 할당합니다
BCLS
. 이 값은 사용자가 선택하는 모든 것이 될 수 있습니다. 이 예에서는 BCLS (브라이트코브 학습 서비스) 를 사용하고 있습니다.
const BCLS = ( ( window1, undefined ) => {
var object1 = {};
object1.count = 1;
object1.method = function () {
...
}
return object1;
})(window);
이제object1
객체는 두 개의 공용 속성, 즉 이름이 지정된count
변수와 이름이 지정된 함수를 사용하여 전역적으로 사용할 수method
있습니다. 익명 함수 외부에서 다음과 같이 액세스 할 수 있습니다.
BCLS.object1.count
BCLS.object1.method
전체 예제
다음은 자바 스크립트 모듈 디자인 패턴의 몇 가지 완전한 예입니다.
예제 1
이 예에서는 모듈 패턴을 사용하여 개인 및 공용 변수와 함수를 만드는 방법을 보여 줍니다.
- 비공개 변수:
myvar
,myvar2
- 비공개 기능:
fname
,fname2
- 공용 변수:
myvar3
- 공용 기능:
fname3
const BCLS = ( () => {
var myvar = value,
myvar2 = value;
fname = () => {
...
};
fname2 = () => {
...
};
return {
fname3 : () => {
...
},
myvar3 = value;
};
}());
예제 2
이 예제는 전역 객체를 전달하고 공용 함수를 노출합니다.
const BCLS = ( ( window, document, videojs ) => {
var myvar = value;
// use a global object passed into the anonymous function
videojs.registerPlugin('overlay');
fname = () => {
...
}
return {
fname2 : () => {
...
}
}
})(window, document, videojs);
// call the public function fname2
var newvar = BCLS.fname2();
코드 샘플
코드 예제 중 일부는 JavaScript 모듈 디자인 패턴을 사용하며이 패턴을 구현하는 방법에 대한 아이디어를 검토 할 수 있습니다.