scope
자바스크립트의 변수선언 방법은 var 였으나 모던 자바스크립트에 와서는
let과 const가 추가되었다.
var 가 함수단위의 스코프 였다면
let과 const 는 블럭 단위의 스코프라고 설명 할 수 있다.
const 는 상수를 의미하고 let은 변수를 의미함
재할당
// var의 경우var a = 1
a = 2
console.log(a) // 2
var a = 3
console.log(a) // 3
// let의 경우let b = 1
b = 2
console.log(b) // 2
let b = 3 // SyntaxError: Identifier 'b' has already been declared
// const의 경우const c = 1
c = 2 // TypeError: Assignment to constant variable
스코프
var a = 1 let b = 2
if (true) {
var a = 11
let b = 22
console.log('a = ' + a) // 11
console.log('b = ' + b) // 22}
console.log('a = ' + a) // 11
console.log('b = ' + b) // 2
function func() {
var a = 111
let b = 222
console.log('a = ' + a) // 111
console.log('b = ' + b) // 222}
func()
console.log('a = ' + a) // 11
console.log('b = ' + b) // 2
앞서 말했듯이 let은 블럭단위 스코프 이기 때문에 위와 같은 결과를 낸다.
또한 let은 재할당이 가능한 반면에 const는 재할당이 불가능 하기 때문에 상황에 맞게 잘 사용해야 한다.
let과 클로저
클로저 : 클로저는 독립적인 (자유) 변수를 가리키는 함수이다. 또는, 클로저 안에 정의된 함수는 만들어진 환경을 ‘기억한다’. 라고 함
간단하게 말하면 함수내에서 함수를 정의하고 사용하면 클로저라고 생각하면 된다.
function getClosure() {
var text = 'variable 1';
return function() {
return text;
};
}
var closure = getClosure();
console.log(closure()); // 'variable 1'
위의 getCloseure()함수는 함수를 리턴하고 리턴한 함수는 getClosure의 text변수를 리턴하고 있음
함수가 리턴되는 함수 즉 클로저
위에 4가지 언어명이 나와있는 리스트를 클릭 하면 몇번째 항목인지 콘솔로 리턴해주는 코드가 있다
그러나 위에 결과 값에 처럼 어느 언어를 찍어도 결과값이 나올 뿐이다.
이유는 이벤트 핸들러가 var i 의 결과값을 공유하기 때문에 1을 찍어도 2를 찍어도 결과적으로 최종값인 4가 나올수 밖에 없다. 이를 해결하기 위해서 스코프를 추가하여
i를 지역변수화 해서 수정할 수 있다 그러나. let 키워드를 이용해서도 해결이 가능하다.
const - 할당된 내용 지키기
function home(){
var home = "지역변수";
home="지역변수에 할당"
console.log(home)
}
home(); // 결과값 : "지역변수에 할당"
정상적으로 할당 된다.
function home(){
let home = "지역변수";
home="지역변수에 할당"
console.log(home)
}
home(); // 결과값 : 에러 발생
const 는 재할당 할 경우 타입과 상관없이 오류를 발생시킨다.
그러므로 ES6에서는
const를 기본으로 사용하되 변경이 필요한 부분은 let을 사용하면 되고 var는 사용하지 않는 것이 좋다
그렇다고 해서 const 가 불변은 아니다 오브젝트 및 배열에서 값을 변경하거나 추가하는 것은 가능하다.
아래 코드를 확인하자
function home(){
const list = [1,2,3,4,5]
list.push(99)
console.log(list)
}
home(); // [1,2,3,4,5,99]
immutable array (불변의) 를 만드는 방법
function home(){
const list = [1,2,3,4,5]
list.push(99)
list2 = [].concat(list,100000)
console.log(list,list2)
}
home(); //[1,2,3,4,5,99] [1,2,3,4,5,99,100000]
이렇게 만들면 list 를 계속 추가해도 1과 2 앞으로만들 리스트는 변하지 않고 추가할수있다.
ES2015의 String 메소드
startsWith
endsWith
includes
사용방법은 아래 코드를 확인
let str = "hello world! ^^l"
let matcheStr = "hello"
let matcheEnd = "^^l"
console.log(str.startsWith(matcheStr)) //true
console.log(str.endsWith(matcheEnd)) //true
console.log(str.includes("^^")) //true
for of 순회하기
let str = "hello world! ^^l"
for(let value of str){
console.log(value)
}
한글자씩 순회하며 보여준다.
for in은 어레이에서는 사용하지 말아야 한다. 왜냐하면 for in의 경우 문제가 생김 어허이
spread operator - 배열의 복사 / 펼침연산자.
let data = [1,2,3,4,5]
let newData = [...data]
console.log(data,newData) // [1,2,3,4,5] [1,2,3,4,5]
console.log(data === newData) //false
...배열명 을 넣으면 해당 배열을 넣은 곳에 펼쳐 입력한다 완전 다른 객체가 생성된다.
data === newData == false 인 이유다.
spread operator - 배열의 활용
let data = [100,200,300]
function sum (a,b,c){
return a+b+c
}
console.log(sum.apply(null,data))
console.log(sum(...data))
from 메소드로 진짜 어레이 만들기
기존 자바스크립트에서 arguments 를 활용하는 메소드 코드가 있다
arguments를 이용하여 파라미터 없이 변수를 받을 수 있다 자주사용되는 패턴은 아니지만 변수가 가변적일 때 사용할 수 있는 방법이다.
ES6에서 map을 이용하여 동일한 효과를 낼수 있는데 아래와 같은 오류가 발생한다. 원인은 arguments 가 배열이 아니기 때문에 map을
사용할수가 없어서 발생하는 오류이다
Array.from()를 이용하여 arguments 를 배열로 변환해주면 해결된다.