본문 바로가기
패스트캠퍼스/자습

자바스크립트 개발자라면 알아야하는 핵심 컨셉(2) scope,Expression, IIFE, Message Queue and Event Loop , None blocking, SetTimeout

by sunnykim91 2019. 7. 4.

1. Scope

if(true){
	const hello = 'hi';
    console.log(hello)
}

console.log(hello);

위 콘솔은 hi가 찍히지만, 아래 hello는 알수가없다.

서로 scope가 다르기 때문에.

 

const h = 'hello';

function a(){
	console.log(h);
    const b = 'b';
}

a()
console.log(b)

global scope 는 const h 

function안에 있으면, 전역 스코프를 참조 할수 있음.

결과는 hello만 찍히고 b는 찍히지 않음.

 

큰 곳에서 작은곳으로 접근이 불가능, 작은곳에서 큰곳으로 접근 가능

function a(){
  const b="b";
  function c() {
    const d = "d";
    function e(){
      const nn = 'nn';
    }
  }
}

함수 e는 b와 d에 접근할 수 있음.

함수 c는 b에 접근할 수 있지만, nn에는 접근 불가.

 

2. Expression

표현식

value를 리턴하는 하는 무언가. 뭔가 value가 되는 것 , 값으로 평가 될 수 있는

 

function add(a, b){
	return a+b; // 리턴하지 않으면, 콘솔은 undefined
}

const how = add(5,6);

console.log(how)

add(5,6)은 expression이다. 무언가 value를 리턴하는 것.

 

statement 명령 혹은 지시 (문)

 

변수로 저장할 수 있는 것은 expression / statement는 변수로 저장 불가.

 

const awesome = add(1,5);

function add(a,b){
  return a+b;
}

console.log(awesome);

function declaration 함수 호이스팅 때문에 위코드가 정상작동이 됨.( 먼저 선언되지 않았지만, 실행이 가능)

function expression과의 차이이다.

 

const awesome = add(1,5);

const add = (a,b) => a+b;

console.log(awesome);

위코드는 실행되지 않음. Not defined이기 때문에

 

3. IIFE

Immediately invoked function expressions

함수이고, 자기자신을 일으키는 함수.

(function(){
  const secretUsers = 
    ["hi","hi2","hi3","hi4"];
    console.log(secretusers);
})()

위처럼 즉시실행함수 처럼 만들면, private 해져서 클라이언트가 함부로 접근할 수 없음.

 

Module

// <app.js>
export let users = ["a","b","c","d"];

export const addUser = () => users = [...users, user];

export const getUsers = () => users;

export const deleteUser = (user) => users = users.filter(aUser => aUser !== user);

// <app2.js>

import { users, addUser, getUsers, deleteUser } from "./app.js"

console.log(getUsers());
adduser("e")
console.log(getUsers());

// index.html

<body>
	<script src="app.js></script>
    <script src="app2.js></script>
</body>


브라우저는 export, import를 이해 하지 못하여서 에러가 남. 

이럴때 웹팩이나 gulp를 사용한다. 

하지만, ES6부터 Module기능을 제공하여서 아래와같이 바꿔줄수 있다.

 

// index.html

<body>
  <script type="module" src="app.js></script>
  <script type="module" src="app2.js></script>
</body>


script type만 모듈로 해주면, 에러 없이 가능하다.

 

 

4) Message Queue and Event Loop , None blocking

 

파이썬은 블로킹 언어 , 자바스크립트는 논블로킹 언어

자바스크립트가 만약 블로킹이었으면, 

자바스크립트가 blocking이었으면, input이 block되어 사용할 없다. 웹사이트에서 아무일도 없다.

 

예시) alert는 blocking funciton이다.

 

alert("hello");

console.log('hi');

hi는 찍히지 않는다. alert창이 닫히기 전까지는..!

 

setTimeout(()=> console.log("hi"), 0)

console.log("bye")

bye가 먼저 실행되고 hi 실행된다.

 

자바스크립트는 settimeout을 web api로 가져감(브라우저)

그리고 나서 bye부분이 stack에들어가서 호출 되고나서 setTimout이 이벤트 큐로 들어감.

이벤트큐로 들어간 setTimeout은 콜스택이 비어져있으면 호출되어 콜스택으로 들어와서 실행됨

** 여기서 0초는 얼마나 기다려야하는건가아니라 최소 기다려야하는 시간이다.(실행하기 까지 최소 기다려야하는 시간)

 

 

 

반응형