: 선언-> 초기화 단계를 거쳐 수행
-> var을 이용한 변수 선언은 선언과 초기화가 동시에 진행된다.
-> 여기서도 선언과 초기화 전에 출력했음에도 오류가 나지 않고, undefined가 출력된다. 그 이유는 '호이스팅' 때문이다.
: js 엔진은 소스코드를 한 줄씩 실행하기에 앞서(런타임 이전에 앞서), 선언문을 찾아내 먼저 실행한다. (변수 선언문, 함수 선언문)
즉, 변수 선언이 어디에 있든 다른 코드보다 먼저 실행되는 것
--> 코드 실행 전, 변수 선언/함수 선언이 해당 스코프의 최상단으로 끌려올려진 듯 한 현상
--> var로 선언한 변수에서만 오류없이 실행됨
-> 함수 선언문도 마찬가지!! 선언문의 경우에는 오류가 나지 않지만, 표현식의 경우에는 오류가 난다.
: 선언 단계와 초기화 단계가 동시에 이루어짐
-> 스코프에 변수를 등록하고, 메모리 공간을 확보한 후, undefined로 초기화한다.
-> 선언과 초기화는 런타임 이전에 호이스팅되어 발생하지만, 할당은 소스코드를 한 줄 한 줄 읽는 런타임 때에 발생한다.
-> 변수 중복 선언 가능
-> 재할당 가능
-> 함수 아닌 곳에서 선언 시, 전역변수로
-> 함수 레벨 스코프
: 선언 단계와 초기화 단계가 분리되어 일어남/ 초기화 이전에 변수에 접근하고자 하면, 오류가 발생한다.
-> 초기화 이전: 스코프에 변수를 등록하였지만, 초기화가 되지 않아서 아직 메모리 공간이 확보되지 않았다. 따라서 초기화 전 까지는 변수를 참조할 수 없다.
-> 중복 선언 불가
-> 재할당 가능
-> 블록레벨 스코프
:선언과 동시에 초기화 해주어야 함
-> 중복 선언 불가
-> 재할당 불가
-> 원싯값을 재할당 불가, 객체 요소는 재할당 가능
-> 블록 레벨 스코프
---> var 보다는 let 사용하는 거 권장! 상수라면 const!
⭕ 변수 정리:
: ECMAScript 의 약자로, 자바스크립트의 표준/규격을 나타내는 용어이다.
-> 2015년에 에 출시 됨.
-> 아래와 같은 새로운 기능들을 포함하고 있다.
-> ES5 이하 명세에서 문제가 되었던 부분이 해결되었고, 많은 기능들이 추가되었기 때문이다.
-> 가독성 & 유지보수성 향상
-> react, vue와 같은 유명 라이브러리들도 이에 맞춰 개발 환경을 바꿈
--> 따라서 ES6이 중요!
: 전통적인 함수 표현의 간편한 대안
-> 인수가 하나면 괄호 생략 가능
-> 인수가 하나도 없을 땐, 괄호를 비워놓으면 됨.
-> 중괄호가 있따면, return 해줘야 함.
-> 화살표 함수로 메서드를 정의하는 것은 피해야한다. this는 화살표 함수 안 이므로, 객체가 아닌 window를 뜻한다.
-> new와 함께 호출할 수 없다.
-> 이벤트 메서드에 콜백함수로 쓰면 안됨.
⭕ 정리
⭕ 정리
기존에 있던 배열이나 객체를 가져와서 새로운 값을 추가하거나 변경하기 위해서, 기존의 것을 가져올 때 사용하는 연산자
: 백틱을 사용하여 문자열 표현 쉽게 하는 방법
-> 백틱으로 문장 감 싸고, 따옴표는 백틱으로, 변수는 ${변수명}
기존
-> 변수값과 문자열을 함께 출력하기 위해서, 따옴표와 +연사자를 작성해야하고, 띄어쓰기에 따로 신경을 써주어야 했다.
ES6
-> 위와 같은 방식으로 간단하게 코드를 작성하는 것을 템플릿 문자열이라고 한다.
-> 코드가 더욱 간결해지고, 가독성 높아짐
-> 따옴표들은 대신에 백틱(`)으로 작성한다.
-> $, ', "을 작성할 때, 이스케이프 문자를 사용할 필요가 없다.
: 배열이나 객체의 값을 해체하여 각각 변수에 저장하는 js 표현식
기존
-> 배열의 값을 직접 하나하나 지정해줌
비구조화 할당 방식
-> 기본값 지정
기존
비구조 할당
-> 기본값 지정
: js 는 동기(싱글스레드)- 하나에 하나의 작업만 수행
-> 한 작업이 실행되는 동안, 다른 작업들은 멈춘 상태를 유지하며 자신의 차례를 기다림
-> js 실행환경(runtime)과 관련이 있다.
-> 브라우저에서는 js 엔진만으로 작동하지 않는다. 비동기 처리 위한 web API를 제공한다.
*js는 싱글스레드인데, 어떻게 비동기가 가능한가? (비동기는 멀티태스킹 작업임)
-> 자바스크립트는 웹 브라우저나 자바스크립트 엔진에서 실행된다. 여기에는 싱글 스레드만 존재한다. 이 엔진 뿐 아니라 비동기식 처리 모델인 Web API 가 함께 동작하면서, 데이터를 가져오는 것과 같은 시간이 소요되는 일을 처리한다.
즉, 자바스크립트 엔진 스레드와는 다르게 비동기 처리를 따로 돈다.
-> 위 코드의 결과는 위와 같다.
printImmediately, printWithDelay함수는 호이스팅 된다. 그 후, 코드 하나하나 순서대로 실행된다.
-> 1이 출력된다.
-> 그와 동시에 비동기 처리가 진행된다. setTimeout라는 web api는 비동기처리되므로 브라우저에게 1초 후 2를 출력하는 callback함수를 담고 있다. 즉, 브라우저야!! 요청왔어!! 1초 후 2출력해줘라고 요청하는 것이다. 그때, 그 2를 출력하는 함수가 callback함수가 되는 것이다. 즉, 요청이 끝난 후 실행해야 할 함수이다.
: 특정 함수에 매개변수로 전달된 함수
-> 매개변수로 넘겨진 건 일단 넘겨받고, 때가 되면 호출한다
-> 익명의 함수 사용
-> 함수 이름만 넘겨줌
-> 콜백 지옥 (가독성 떨어져, 디버깅 유지보수 문제분석 어려워)
--> promise 통해 해결
그냥 일단 넘겨받고 필요할 때 호출하기 위해 사용하는 함수라고 생각하자!
--->>> 즉, callback 함수는 요청 처리 이후(setTimeout, setInterval), 실행해야 할 함수를 의미
: callback 함수의 단점을 보완하기 위해서 (무한 콜백 현상)
-> 비동기 작업이 종료된 후, 성공 여부와 결괏값 돌려줌
1. 실행이 잘 성공했는지
2. 혹은 실패했는지
3. 그럼 성공 or 실패의 결과 값이 무엇인지
위 세가지 내용을 미래(비동기 작업이 종료된 후)에 반환해주겠다고 약속해주는 객체이다.
<구현>
producer:
-> promise 만들어지는 순간, 안의 callback 함수 자동적으로 실행!!
consumer: then, catch, finally로 가져올 수 있음
-> then: 잘 수행이 성공되었을 경우! promise가 잘 수행되었을 경우, 위의 resolve 결과가 value에 들어옴
-> catch: 오류 잡음/ finally: 마지막에 무조건 수행
: promise를 좀 더 간단히!! 동기적으로 실행되는 것처럼!!
-> 아직, 비동기 파트에 대한 내용이 잘 이해가 가지 않는다. 이 부분은 계속해서 더 공부해야겠다!!
https://www.youtube.com/watch?v=s1vpVCrT8f4
이 영상 이해 잘 됨!!
https://velog.io/@khy226/%EB%8F%99%EA%B8%B0-%EB%B9%84%EB%8F%99%EA%B8%B0%EB%9E%80-Promise-asyncawait-%EA%B0%9C%EB%85%90