스코프, 이벤트 - JeongWu/fe-javascript GitHub Wiki

스코프

변수의 유효접근 범위

전역 스코프

const globalVariable = 'some value'

지역 스코프

  • 함수 스코프: 함수 내부에서만 변수 접근가능
function sayHello () {
  const hello = 'Hello'
  console.log(hello)
}
sayHello() // 'Hello'
console.log(hello) // undefined

  • 블록 스코프: 블록 내부에서만 변수 접근 가능
  • let, const(ES6)로 블록 기반 스코프 사용가능
{
  const hello = 'Hello'
  console.log(hello) // 'Hello'
}
console.log(hello) // undefined

스코프 체인

상위 스코프에 찾는 변수가 없다면 전역 스코프에 도달할때까지 바깥쪽 스코프로 나가는 것

  • 스코프 함수가 선언될 때 결정
  • 실행 컨텍스트: 함수가 실행될 때 변수객체(arguments, variable), scope chain, this

hoisting

  • 선언문이 최상위로 끌어올려지는 동작 (함수>변수)
  • 실행 컨텍스트 만들어질 때 발생
foo();
bar();
function bar(){
};

function bar(){
};
foo();
bar();
foo();
bar();
var foo=function bar(){
};

var foo;
foo();//TypeError
bar();//ReferenceError
foo=function(){
var bar=...self...
};

클로저

: 내부함수가 외부함수의 context에 접근할 수 있는 것
-> 함수가 선언되었을 떄 실행 환경은 해당 컨텍스트가 종료된 후에도 메모리상에 남아 접근 가능

for(var i=1;i<=5;i++){
    setTimeout(function timer(){
     console.log(i);
        },i*1000);
}
// 6 6 6 6 6
for(var i=1;i<=5;i++){
   (function(){
     var j=i;
     setTimeout(function timer(){

     console.log(j);
        },i*1000);
    })();
}
// 1 2 3 4 5
for(let i=1;i<=5;i++){
     setTimeout(function timer(){
     console.log(i);
   },i*1000);
}
// 1 2 3 4 5

이벤트

자바스크립트

  • 싱글 스레드 언어
  • 비동기로 동작

처리과정

  • Heap: 메모리 할당이 발생하는 곳
  • Call Stack: 실행된 코드의 환경을 저장
  • Web APIs: DOM, AJAX, setTimeout 등 브라우저가 제공하는 API
  • Task Queue: 이벤트 발생 시 실행해야 할 callback 함수 차례대로 저장
  • Event loop: Call Stack이 비어있을 경우, Task queue에서 함수를 꺼내 Call Stack에 추가

DOM Event

var handler=function(){
    console.log("click");
};

window.addEventListener("click", handler); // 등록
window.removeEventListener("click" ,handler); // 제거