JS 튜토리얼

제이에스 홈 JS 소개 JS 어디로 JS 출력 JS 문 JS 구문 JS 코멘트 JS 변수 제이에스렛 JS 상수 JS 연산자 JS 산술 JS 할당 JS 데이터 유형 JS 함수 JS 객체 JS 이벤트 JS 문자열 JS 문자열 메서드 JS 문자열 검색 JS 문자열 템플릿 JS 번호 JS 숫자 메서드 JS 배열 JS 배열 메서드 JS 배열 정렬 JS 배열 반복 JS 배열 상수 JS 날짜 JS 날짜 형식 JS 날짜 가져오기 메서드 JS 날짜 설정 방법 JS 수학 JS 랜덤 JS 부울 JS 비교 JS 조건 JS 스위치 JS 루프 In에 대한 JS 루프 의 JS 루프 JS 루프 동안 JS 브레이크 JS 이터러블 JS 세트 JS 맵 JS 유형 JS 유형 변환 JS 비트와이즈 JS 정규 표현식 JS 오류 JS 범위 JS 호이스팅 JS 엄격 모드 JS 이 키워드 JS 화살표 함수 JS 클래스 JS JSON JS 디버깅 JS 스타일 가이드 JS 모범 사례 JS 실수 JS 성능 JS 예약어

JS 버전

JS 버전 JS 2009(ES5) JS 2015(ES6) JS 2016 JS 2017 JS 2018 JS IE / 엣지 JS 연혁

JS 객체

객체 정의 개체 속성 개체 메서드 개체 표시 개체 접근자 객체 생성자 개체 프로토타입 객체 반복 가능 객체 세트 객체 맵 개체 참조

JS 함수

기능 정의 기능 매개변수 함수 호출 함수 호출 기능 적용 함수 클로저

JS 클래스

수업 소개 클래스 상속 클래스 정적

JS 비동기

JS 콜백 JS 비동기 JS 약속 JS 비동기/대기

JS HTML DOM

DOM 소개 DOM 메서드 DOM 문서 DOM 요소 DOM HTML DOM 양식 DOM CSS DOM 애니메이션 DOM 이벤트 DOM 이벤트 리스너 DOM 탐색 DOM 노드 DOM 컬렉션 DOM 노드 목록

JS 브라우저 BOM

JS 창 JS 화면 JS 위치 JS 연혁 JS 네비게이터 JS 팝업 경고 JS 타이밍 JS 쿠키

JS 웹 API

웹 API 소개 웹 양식 API 웹 기록 API 웹 스토리지 API 웹 작업자 API 웹 가져오기 API 웹 지리적 위치 API

JS 아약스

AJAX 소개 AJAX XMLHttp AJAX 요청 AJAX 응답 AJAX XML 파일 AJAX PHP AJAX ASP AJAX 데이터베이스 AJAX 애플리케이션 AJAX 예제

JS JSON

JSON 소개 JSON 구문 JSON 대 XML JSON 데이터 유형 JSON 구문 분석 JSON 문자열화 JSON 객체 JSON 배열 JSON 서버 JSON PHP JSON HTML JSON JSONP

JS 대 jQuery

jQuery 선택기 제이쿼리 HTML 제이쿼리 CSS 제이쿼리 DOM

JS 그래픽

JS 그래픽 JS 캔버스 JS 플로틀리 JS 차트.js JS 구글 차트 JS D3.js

JS 예제

JS 예제 JS HTML DOM JS HTML 입력 JS HTML 객체 JS HTML 이벤트 JS 브라우저 JS 편집기 JS 연습 JS 퀴즈 JS 인증서

JS 참조

자바스크립트 객체 HTML DOM 객체


자바스크립트 클로저


JavaScript 변수는 로컬 또는 전역 범위 에 속할 수 있습니다 .

전역 변수는 클로저 를 사용하여 로컬(비공개)로 만들 수 있습니다 .


전역 변수

A 는 다음과 같이 함수 내부function 에 정의된 모든 변수에 액세스할 수 있습니다 .

예시

function myFunction() {
  let a = 4;
  return a * a;
}

그러나 다음 과 같이 함수 외부function 에 정의된 변수에도 액세스할 수 있습니다 .

예시

let a = 4;
function myFunction() {
  return a * a;
}

마지막 예에서 a전역 변수입니다.

웹 페이지에서 전역 변수는 창 개체에 속합니다.

전역 변수는 페이지(및 창)의 모든 스크립트에서 사용(및 변경)할 수 있습니다.

첫 번째 예에서 a지역 변수입니다.

지역 변수는 정의된 함수 내에서만 사용할 수 있습니다. 다른 기능 및 기타 스크립팅 코드에서 숨겨집니다.

같은 이름을 가진 전역 변수와 지역 변수는 다른 변수입니다. 하나를 수정해도 다른 하나는 수정되지 않습니다.

선언 키워드( , , 또는 ) 없이 생성된 변수 는 함수 내부에서 생성된 경우에도 항상 전역 변수입니다.varletconst

예시

function myFunction() {
  a = 4;
}


가변 수명

전역 변수는 다른 페이지로 이동하거나 창을 닫을 때와 같이 페이지가 삭제될 때까지 유지됩니다.

지역 변수는 수명이 짧습니다. 함수가 호출될 때 생성되고 함수가 완료되면 삭제됩니다.


카운터 딜레마

어떤 것을 계산하기 위해 변수를 사용하고 이 카운터를 모든 함수에서 사용할 수 있기를 원한다고 가정합니다.

전역 변수를 사용하고 function카운터를 늘릴 수 있습니다.

예시

// Initiate counter
let counter = 0;

// Function to increment counter
function add() {
  counter += 1;
}

// Call add() 3 times
add();
add();
add();

// The counter should now be 3

위의 솔루션에는 문제가 있습니다. 페이지의 모든 코드는 add()를 호출하지 않고 카운터를 변경할 수 있습니다.

카운터는 add()다른 코드가 변경하지 못하도록 함수에 대해 로컬이어야 합니다.

예시

// Initiate counter
let counter = 0;

// Function to increment counter
function add() {
  let counter = 0;
  counter += 1;
}

// Call add() 3 times
add();
add();
add();

//The counter should now be 3. But it is 0

로컬 카운터 대신 글로벌 카운터를 표시하기 때문에 작동하지 않았습니다.

전역 카운터를 제거하고 함수가 반환하도록 하여 로컬 카운터에 액세스할 수 있습니다.

예시

// Function to increment counter
function add() {
  let counter = 0;
  counter += 1;
  return counter;
}

// Call add() 3 times
add();
add();
add();

//The counter should now be 3. But it is 1.

함수를 호출할 때마다 로컬 카운터를 재설정했기 때문에 작동하지 않았습니다.

 JavaScript 내부 함수는 이것을 해결할 수 있습니다.


자바스크립트 중첩 함수

모든 함수는 전역 범위에 액세스할 수 있습니다.  

사실, JavaScript에서 모든 함수는 "위" 범위에 액세스할 수 있습니다.

JavaScript는 중첩 함수를 지원합니다. 중첩 함수는 "위" 범위에 액세스할 수 있습니다.

이 예에서 내부 함수 는 상위 함수 plus()의 변수에 액세스할 수 있습니다.counter

예시

function add() {
  let counter = 0;
  function plus() {counter += 1;}
  plus();   
  return counter;
}

plus() 외부에서 함수 에 접근할 수 있었다면 카운터 딜레마를 해결할 수 있었을 것 입니다.

counter = 0또한 한 번만 실행할 수 있는 방법을 찾아야 합니다 .

폐쇄가 필요합니다.


자바스크립트 클로저

자체 호출 기능을 기억하십니까? 이 기능은 무엇을 합니까?

예시

const add = (function () {
  let counter = 0;
  return function () {counter += 1; return counter}
})();

add();
add();
add();

// the counter is now 3

예시 설명

변수 add는 자체 호출 함수의 반환 값에 할당됩니다.

자체 호출 기능은 한 번만 실행됩니다. 카운터를 0으로 설정하고 함수 표현식을 반환합니다.

이렇게 하면 add 함수가 됩니다. "멋진" 부분은 상위 범위의 카운터에 액세스할 수 있다는 것입니다.

이것을 JavaScript 클로저라고 합니다. 함수가 " private " 변수를 가질 수 있도록 합니다.

카운터는 익명 함수의 범위로 보호되며 add 함수를 통해서만 변경할 수 있습니다.

클로저는 상위 함수가 닫힌 후에도 상위 범위에 액세스할 수 있는 함수입니다.