🔭
Ellery's study archive
Resume(수정중)GithubTistory
  • framework, library
    • Spring core
      • 스프링 트라이앵글 - POJO, IOC/DI, AOP, PSA
      • Servlet
    • Spring MVC
      • DispatcherServlet
      • Validation
    • Spring Boot
    • Spring Security
    • Spring Batch
    • Spring Webflux
    • JPA
    • JUnit, Spring Test
    • etc
      • Slf4j MDC(Mapped Diagnostic Context)
  • ETC, 개발 팁들
    • 개발 팁들
      • 스프링 프로젝트 init 시에 해야될 것들
      • vim 한글 깨질 때 인코딩 방식 지정
      • EC2 ssh connection 쉽게 하기
      • 리눅스 커맨드, netstats
      • Fork한 레포지토리 origin 업데이트
      • git merge, rebase
      • Intellij 자주 쓰는 기능 단축키
      • JSON handling
      • aws user-data.sh
    • Lombok annotation, 권장 방식
    • DB 모델링 시에 인조 식별자 정의하는 케이스
    • Redis pub/sub vs Apache kafka
  • Language
    • Java
      • 자바 버젼별 feature
      • JVM architecture
      • Garbage collection
      • Java String pool
      • java 8 Concurrent
      • Optional
      • Stream
      • Comparator, Comparator
      • Error, Exception
      • Java의 Call by value(pass by value)
      • Java 변수 간 값 Swap 방식 5가지
    • Javascript
      • 자주 쓰는 ES6 문법 정리
      • ES6 module
      • ES6 proxy
      • scope, var closure 이슈, let, const
    • Python
      • @lru_cache
  • CS
    • OS
      • Process, Thread
      • CPU scheduling
      • sync vs async, blocking vs nonblocking
      • Memory segmentation
      • virtual memory
      • 페이지 교체 알고리즘
    • Network
      • UDP
      • TCP
      • DNS
      • HTTP
      • web server, WAS
      • Proxy, Load balancer
      • web socket, WebRTC
      • gRPC
      • web secure
    • DB
      • MySQL
      • index
      • 정규화
      • DB 트랜잭션, 동시성 제어 문제
      • 클러스터링
      • 레플리케이션
      • 샤딩
    • Data Structure, Algorithm
      • AVL tree, Red black tree
      • B-tree, B*tree, B+tree
      • Hash
    • Design pattern
      • SOLID
      • 생성 패턴
        • 싱글톤 패턴
        • 팩토리 메서드 패턴
        • 빌더 패턴
        • Null 객체 패턴
      • 구조 패턴
        • 퍼사드 패턴
        • 프록시 패턴
        • 어댑터 패턴
        • 데코레이터 패턴
      • 행위 패턴
        • 전략 패턴
        • 템플릿 메서드 패턴
        • 상태 패턴
        • 옵저버 패턴
  • 소프트웨어 아키텍쳐
    • Layered Architecture
    • 클린 아키텍쳐
    • DDD
    • etc
      • DTO vs VO
  • 개발 서적들
    • 소트웍스 앤솔로지에서 소개되는 객체지향 생활 체조 원칙 간략 정리
    • 엘레강트 오브젝트 - 새로운 관점에서 바라본 객체지향
    • 만들면서 배우는 클린 아키텍쳐
  • 테크 블로그
Powered by GitBook
On this page
Edit on GitHub
  1. Language
  2. Javascript

scope, var closure 이슈, let, const

  • var 변수의 특징

    • function level scope - 함수의 코드 블록만을 스코프로 인정한다. 전역변수 외부에서 생성된 변수는 모두 전역변수이기 때문에 남용될 수 있다

    • var 키워드 생략 허용 - 암묵적인 전역변수가 허용된다

    • 변수 중복 선언 허용 - 의도하지 않는 변수값의 변경이 일어날 수 있다

    • 변수 호이스팅 - 변수를 선언하기 이전에 참조할 수 있다

    → let, const 사용

  • var의 closure 이슈

    • 대부분의 언어들은 블록 레벨 스코프를 따름

    • function-level scope: 함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없다. 즉 함수 내부에서 선언된 변수는 지역 변수이며, 함수 외부에서 선언한 변수는 모두 전역 변수이다. (var)

    • block-level scope: 모든 코드 블록(function, if, for,while, try-catch...) 내에서 선언된 변수는 코드 블록 내에서만 유효하며 코드 블록 외부에서는 참조할 수 없다. 즉 코드 블록 내부에서 선언한 변수는 지역 변수이다. (let, const)

    var list = document.querySelectorAll('li')
    for(var i = 0; i < 4; ++i) {
    	list[i].addEventListener("click", function() {
    		console.log(i + "번째 리스트입니다")
    	}) // 클릭하면 4 4 4 4 나옴
    }
    
    for루프의 i가 전역변수라서 4가 출력된다. 
    
    for(var i = 0; i < 4; ++i) {
    	(function (idx) {
    		list[idx].addEventListener('click', function() {
    			console.log(idx)
    		})
    	}(i))
    }
    
    IIFE로 작성할 수 있다(정의와 동시에 실행). var의 함수레벨 스코프로 인하여 for 루프의 초기화식에
    사용된 변수가 전역스코프를 가져서 발생하는 문제를 회피하기 위해 클로저를 이용함
    (클로저 - 반환된 내부함수가 자신의 선언됬을 때의 환경(lexical environment)인 스코프를 기억하여
    자신이 선언됬을 때의 환경(스코프) 밖에서 호출되어도 그 환경(스코프)에 접근할 수 있는 함수)
    
    for(let i = 0; i < 4; ++i) {
    	list[i[.addEventListener('click', function() {
    		console.log(i)
    	})
    }
    
    for루프의 let i 변수는 for루프에서만 유효한 지역변수이다. 하지만 for루프가 종료되어도 자유변수 i를 참조하는
    함수가 존재하면 계속 유지된다
  • const - 상수. 재할당 불가

    • const list = [’a’, ‘b’, ‘c’], list에 대해서 재할당 불가이지 list 내부 값 변경은 가능하다

    • immutable array 구현

      const list = ['a', 'b', 'c']
      list2 = [].concat(list, 'd')
      console.log(list === list2) // false
PreviousES6 proxyNextPython

Last updated 2 years ago