[JavaScript] let 변수, const 변수 1
본 정리글은 인프런 김영보 강사님의 자바스크립트 ES6+ 기본 강의를 수강하고 정리한 글입니다.
📖 let 변수, const 변수 1
📌 변수 구분
-
로컬(지역) 변수, 글로벌(전역) 변수
-
변수를 구분하는 이유 : 기능과 목적의 차이
-
글로벌 변수의 기능, 목적
-- 다른 js 파일에서 변숫값 공유
-- 파일에서 공통 변수 개념으로 사용
-- 의도는 좋으나 처리 속도가 떨어짐
-
로컬 변수의 기능, 목적
-- 빠르게 식별자를 해결하기 위해 가까운 스코프의 변수를 사용하려는 것
-
var 키워드 문제
📌 글로벌 변수 오해
-
글로벌 변수는 글로벌 오브젝트의 로컬 변수
-- var value = 100 처럼 var 키워드 사용이 정상
-
var 키워드를 작성하지 않으면 글로벌 변수로 간주 [코드 1]
// [코드 1]
value = 100;
function point(){
value = 300;
log("함수 : ", value);
};
point();
로컬(지역) 변수, 글로벌(전역) 변수
변수를 구분하는 이유 : 기능과 목적의 차이
글로벌 변수의 기능, 목적
-- 다른 js 파일에서 변숫값 공유
-- 파일에서 공통 변수 개념으로 사용
-- 의도는 좋으나 처리 속도가 떨어짐
로컬 변수의 기능, 목적
-- 빠르게 식별자를 해결하기 위해 가까운 스코프의 변수를 사용하려는 것
var 키워드 문제
글로벌 변수는 글로벌 오브젝트의 로컬 변수
-- var value = 100 처럼 var 키워드 사용이 정상
var 키워드를 작성하지 않으면 글로벌 변수로 간주 [코드 1]
// [코드 1]
value = 100;
function point(){
value = 300;
log("함수 : ", value);
};
point();
[실행 결과]
함수 : 300
-
var 키워드를 사용하지 않고 value를 글로벌 변수로 선언하고 100 할당
-
point() 함수 안에서 value 변수에 300 할당
value 변수가 로컬 변수가 아니므로 글로벌 오브젝트의 value 변수에 300 할당 -
함수 안에서 글로벌 변수에 값을 설정하는 것은 좋은 모습이 아님
-
로컬 변수와 글로벌 변수를 구분한 목적을 생각해야 함 - 스코프를 이용한 빠른 식별자 해결
- log()는 console.log()의 약칭
-- log() 실행 결과를 [실행 결과]에 표시
📌 use strict 사용
-
함수 안에서 var 키워드를 사용하지 않으면 에러 발생 [코드 1]
-- ES 5에서 도입했으나, 근본적인 접근은 아님 -
ES6+
-- "use strict"가 디폴트 환경 - 전체 X
// [코드 1]
"use strict";
function point(){
try{
value = 300
} catch(e){
log("글로벌 변수 사용 불가");
};
};
point();
[실행 결과]
글로벌 변수 사용 불가
📌 function 블록
-
function name(){}도 블록 스코프
-
function 안과 밖에 같은 이름의 let 변수 선언 가능
-- 스코프가 다르기 때문 [코드 1]
// [코드 1]
let sports = "축구";
function show(){
let sports = "농구";
log("안 : ", sports);
};
show();
log("밖 : ", ,sports);
[실행 결과]
안 : 농구
밖 : 축구
- function 밖의 let 변수를 function 안에서 사용 가능 (클로저) [코드 2]
// [코드 2]
let sports = "축구";
function show(){
log(sports);
};
show();
[실행 결과]
축구
📌 try-catch
-
try-catch 문도 블록 스코프
-
try 블록 {} 기준으로 안과 밖에 같은 이름의 let 변수 선언 가능 [코드 1]
// [코드 1]
let sports = "축구";
try{
let sports = "농구";
log("안 : ", sports);
} catch(e){};
log("밖 : ", sports);
[실행 결과]
안 : 농구
밖 : 축구
-
try 블록의 안과 밖에 let sports를 선언
-
안과 밖이 스코프가 다르므로 변숫값이 각각 설정
- catch()에서 try 밖의 변수 사용 [코드 2]
// [코드 2]
let sports = "축구";
try {
let sports = "농구";
log("안 : ", sports);
abc = error;
} catch(e) {
log("catch : ",sports);
};
log("밖 : ", sports);
[실행 결과]
안 : 농구
catch : 축구
밖 : 축구
-
let sports = "농구";
try 블록에서 값을 할당 -
abc = error;
error 변수가 없으므로 에러가 발생 -
log("catch : ", sports)
try 블록 안에서 선언한 sports 값을 출력하지 않고 try 밖의 sports 값을 출력
📌 switch-case
-
switch 문도 블록 스코프
-
swtch 블록 시준으로 같은 이름의 let 변수 작성 불가 [코드 1]
-- case, default는 블록 스코프가 아님
// [코드 1]
let item = 1;
switch(item){
case 1:
let sports;
break;
case 2:
// let sports;
default:
log(sports);
};
-
// let sports;
-
switch 블록 안에서 let을 사용하여 선언한 변수가 있는데 다시 let을 사용하여 변수를 선언하므로 에러가 발생 -> 주석으로 처리 - 실행 에러가 아닌, 컴파일 에러
📌 let 변수 개요
-
let book = "책";
-- 블록(block) 스코프를 가진 변수
-- 변수가 선언된 블록이 스코프 -
스코프 적용 기준
-- 블록{}, 문, 표현식 [코드 1]
// [코드 1]
let sports = "축구";
if (sports) {
let sports = "농구";
log("안 : ", sports);
};
log("밖 : ", sports);
안 : 농구
밖 : 축구
- 블록{} 안과 밖이 스코프가 다름
-- 변수 이름이 같아도 값이 대체되지 않음
📌 let 변수 선언
-
Syntax
-- let name1 [= value1], name2 [= value2]] -
name1, name2에 변수 이름 작성
-- 식별자로 사용
-- []는 생략 가능을 나타냄
-- 값을 할당하지 않아도 됨 [코드 1]
// [코드 1]
let book;
let one, two;
-
let book;
값을 할당하지 않고 변수만 선언할 수 있다.
초깃값으로 undefined가 할당됨 -
let one, two;
콤마로 구분하여 다수를 선언할 수 있다.
- value1, value2에 초깃값 작성
-- 표현식 작성 가능, 평가 결과 사용 [코드 2]
// [코드 2]
let book = "책";
let one = 1, two = (10 + 20);
// let five = 5, let six = 6;
// let five = 5, var six = 6;
-
let book = "책";
변수를 선언하고 초깃값을 할당 -
let one = 1, two = (10 + 20);
콤마로 구분하여 다수와 변수를 선언하고 값을 할당한 형태 -
let five = 5, let six = 6;
SyntaxError 발생
let을 처음에 한 번만 작성 -
let five = 5, var six = 6;
콤마로 구분하여 let과 var을 같이 사용할 수 없다
📌 블록 스코프
-
블록 기준
-- 중괄호 { 코드 }
-- function name() { 코드 }
-- if (a === 1) { 코드 } -
블록 안과 밖이 스코프가 다름
-- 변수 이름이 같아도 값이 대체되지 않음 [코드 1][코드 2]
// [코드 1]
let sports = "축구";
if(sports) {
let sports = "농구";
log("안 : ", sports);
};
log("밖 : ", sports);
[실행 결과]
안 : 농구
밖 : 축구
-
if(sports) {...}
블록{} 안과 밖에 let sports를 작성했으며 스코프가 다르므로 같은 이름을 사용할 수 있다 -
변숫값이 대체되지 않고 유지됨
-
블록 안에서 블록 밖의 변수는 접근할 수 있지만 블록 밖에서 블록 안의 변수는 접근 불가능
// [코드 2]
let sports = "축구";
sports = "농구";
log(sports);
// let sports = "배구";
{
let sports = "탁구";
log(sports);
};
[실행 결과]
농구
탁구
-
sports = "농구";
스코프에서 sports 식별자를 해결
바로 앞에 있으므로 값을 할당 -
// let sports = "배구";
let을 사용하여 같은 스코프에 같은 이름의 변수를 선언 불가능 -
{ let sports = "탁구 : "}
블록 {}을 사용했으며 스코프가 다르므로 let을 사용하여 변수를 선언할 수 있다
- 스코프에 같은 이름 사용 불가
📌 let 변수와 var 변수 차이
- for() 문에서 반복할 때마다 var 변수는 스코프를 갖지 않음
-- let 변수는 스코프를 가짐
📌 var 변수와 스코프
- 선택, 클릭
-- 축구
-- 농구
-- 야구
// html 파일
<ul class=sports>
<li>축구</li>
<li>농구</li>
<li>야구</li>
</ul>
var node = document.querySelector(".sports");
for(var k=0; k<node.children.length; k++){
node.children[k].onclick = function(event){
event.target.style.backgroundColor = "yellow";
log(k);
};
};
[실행 결과]
3
3
3
-
어떤 것을 클릭하더라도 항상 for() 문이 끝났을 때의 값인 3을 출력
-
var k=0;에서 k 변수의 스코프는 함수
- var은 저 코드 1 코드 전체가 스코프
📌 let 변수와 스코프
- 선택, 클릭
-- 축구
-- 농구
-- 야구
// html 파일
<ul class=sports>
<li>축구</li>
<li>농구</li>
<li>야구</li>
</ul>
var node = document.querySelector(".sports");
for(let k=0; k<node.children.length; k++){
node.children[k].onclick = function(event){
event.target.style.backgroundColor = "yellow";
log(k);
};
};
[실행 결과]
0
1
2
-
var k=0;을 let k=0;으로 바꿈
-
이벤트를 설정할 때의 k 값을 출력
Author And Source
이 문제에 관하여([JavaScript] let 변수, const 변수 1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yun12343/JavaScript-let-변수-const-변수-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)