p193 -208

 

비동기와 타이머

  • 동기 = 앞선 작업이 완전히 끝난 후 다음작업이 실행됨
  • 비동기 = 앞선 작업이 끝나지 않았는데도 다음작업이 실행 됨 , 비동기 대표적인 예는 타이머가 있음
setTimeout ()

타이머 함수임 

지정한 시간 뒤에 코드가 실행됨 

특정 작업이후에 추가로 실행되므로 콜백 함수로 볼 수 있음

setTimeout(함수 , 밀리초 );

 setTimeout ()에 넣은 함수는 동기 코드가 모드 실행된 난뒤 실행됨

 

setinterval()
setInterval(함수 , 밀리초)

주기적으로 지정한 함수를 실햄함

 

clearTimeout() 과 clearInterval()
const 아이디 = setTimeout (함수, 밀리초);
clearTimeout (아이디);
const 아이디 = setInterval(함수,밀리초);
clearInterval(아이디);

 

스코프와 클로저 

스코프 (scope) = 범위가 있다  

블록 스코프와 함수 스코프 

모든 변수는 스코프가 있다 

  • var 는 함수 스코프 
  • let 은 블록 스코프 

함수 스코프 = 함수를 경계로 접근 가능 여부가 달라지는 것 / 함수가 끝날 떄 함수 내부의 변수도 같이 사라짐

 

블록 스코프 = 블록은 if 문 for문 while 문 함수에서 볼 수 있는 중괄호 ({}) 를 의미하빈다 

                       즉 블록안에 있는 let 에 접근 할 수 없음 

 

클로저와 정적 스코프

클로저 (closure)는 간단히 말해 외부 값에 접근하는 함수 

func () 함수는 자신의 외부에 있는 변수 a를 사용하고 있다 그래서 fun() 함수는 클로저 이다 

 

반환값인 익명 함수는 자신의 외부에 있는 msg 매개변수를 사용하고 있기 떄문에 클로저이다

 

클로저가 외부 값에 접근 할 수 있는지 판단하는 기준은 스코프 이다 

 

  • 정적스코프 = 함수가 선언된 위치에 따라 접근할 수 있는 값이 달라지는 현상  = 자바스크립트는 정적스코프를 따른다
  • 동적스코프 = 선언된 위치가 아니라 호출된 위치에 따라 접근할수 있는 값이 달라지는것
let 과 var 를 사용한 결과가 다른이유

 

문제점 setTimeout() 인수인 1000 * (i+1) 은 반복문을 돌 떄 실행되고 클로저는 지정한 시간뒤에 호출된다 

           반복문은 매우 빠른 속도로 돌아서 클로저가 실행될떄는 이미 i 4 가 되어있다

 

let 은 반복문을 돌 떄마다 새로운 블록을 생성한다 

i 변수의 값이 고정된다 이것도 스코프의 특성

클로저 내부의 i 변수도 setTimeout () 함수를 호출할 때의 i 변수와 같은 값이 들어간다 

 

 

var 문제를 해결하고 싶다면 i 변수의 값을 고정해야한다 

let 의 변수가 블록마다 값이 고정되는 것처럼 var 의 i 변수도 고정해야함 

helper() 함수는 매개변수  j를 갖고 있는데 j는 i 변수의 값을 고정하는 역할을 함 

setTimeout () 의 클로저는 j를가리키고 있다 

+ Recent posts