함수를 일급 객체로 취급하는 함수형 언어에서 공통적으로 사용되는 중요한 특성이다.클로저는 함수와 그 함수가 선언된 렉시컬 환경과의 조합이다.함수가 선언된 렉시컬 환경은 뭘까. 이것부터 살펴보자.1. 렉시컬 스코프JS 엔진은 함수를 어디서 호출했는지가 아니라 어디서 정의했는지에 따라 상위 스코프를 결정한다.이를 렉시컬 스코프, 정적 스코프라 한다.실행 컨텍스트에서 살펴봤듯이 스코프의 실체는 실행 컨텍스트의 렉시컬 환경으로, 이는 자신의 외부 렉시컬 환경에 대한 참조를 통해 상위 렉시컬 환경과 연결된다. 이것이 스코프 체인이다.따라서 “함수의 상위 스코프를 결정”한다는 것은 “렉시컬 환경의 외부 렉시컬 환경에 대한 참조에 저장할 참조값을 결정"한다는 것과 동치된다. 결국 위 정의는,렉시컬 환경의 “외부 렉시..
실행 컨텍스트, execution context는 JS 동작 원리를 담고 있는 핵심 개념이다. 이를 바르게 이해해야 스코프를 기반으로 식별자와 바인딩된 값을 관리하는 방식, 호이스팅의 발생 이유, 클로저의 동작 방식, 그리고 태스크 큐와 함께 동작하는 이벤트 핸들러와 비동기 처리의 동작 방식을 이해할 수 있다.1. 소스코드 타입4가지 타입의 소스코드가 존재하며, 각각의 실행 컨텍스트를 생성한다.2. 소스코드의 평가와 실행모든 소스코드는 실행에 앞서 평가를 거친다.평가 과정에서는 실행 컨텍스트를 생성하고 선언문만 먼저 실행하여 생성된 변수나 함수 식별자를 키로 실행 컨텍스트가 관리하는 스코프(렉시컬 환경의 환경 레코드)에 등록한다.평가 과정이 끝나면 선언문을 제외한 소스코드가 순차적으로 실행된다. 즉, 런..
1. this 키워드this는 자신이 속한 객체 혹은 자신이 생성할 인스턴스를 가리키는 자기 참조 변수이다. this를 통해 자신이 속한 객체 혹은 자신이 생성할 인스턴스의 프로퍼티나 메서드를 참조할 수 있다.단 this가 가리키는 값, 즉 this 바인딩은 함수 호출 방식에 의해 동적으로 결정된다.전역에서의 this - 전역 객체 window일반 함수 내부의 this - 전역 객체 window메서드 내부의 this - 메서드 호출 객체생성자 함수 내부 this - 생성할 인스턴스2. 함수 호출 방식과 this 바인딩중첩 함수, 콜백 함수의 this가 전역 객체를 바인딩하는 것은 문제가 있다. 외부 함수인 메서드와 중첩, 콜백 함수의 this가 일치하지 않게 되지 않겠는가? 이 문제의 해결을 위해 직접 ..
JS는 프로토타입 기반의 OOP 언어이다. JS는 객체 기반의 언어이며 JS를 이루는 거의 모든 것이 객체다.1. 상속과 프로토타입JS는 프로토타입 기반으로 상속을 구현하여 불필요한 중복을 제거한다. 예를 들어,function Circle(radius) { this.radius = radius; this.getArea = function () { return Math.PI * this.radius ** 2; };}const circle1 = new Circle(1);const circle2 = new Circle(2);// Circle 생성자는 인스턴스를 생성할 때 마다 getArea 메서드를 중복 생성한다.// getArea 메서드는 하나만 쓰는것이 바람직하다.console.log(circle1.ge..
일괄적인 컬러 적용을 위해 테일윈드 :root 클래스에 darkblue 프로퍼티를 선언하여 사용하고 있었습니다.하지만 크롬에서는 작동하고 사파리에선 작동하지 않는 이슈가 터지고 말았습니다!! 아아~크롬만 보고 테스트해서 이미 메인 서비스까지 올려놨는데 말이죠~ 새벽에 확인하고 허겁지겁 롤백했다 아입니꺼~처음에 추정한 원인은 테일윈드CSS 클래스 관련해서 사파리엔 아직 지원하지 않는게 있나? 싶었지만,결국 원인은 오타였습니다. 사진에서 --darkblue를 선언할 때 중간에 쉼표가 들어간 게 보이시나요?--darkblue: 215, 56%, 17% // 이렇게 쉼표를 모두 붙이거나,--darkblue: 215 56% 17% // 이렇게 모두 없애야 합니다.사파리가 이상한 게 아니고, 크롬 브라우저의 CSS..
from collections import dequeans = 0n, k, m = map(int, input().split())mat = []visited = [[False for _ in range(n)] for _ in range(n)]for _ in range(n): mat.append([int(x) for x in input().split()])s_pos = []for _ in range(k): r, c = map(int, input().split()) s_pos.append((r - 1, c - 1))stone_pos = [(i, j) for i in range(n) for j in range(n) if mat[i][j] == 1]selected_stones = []q = deq..
간단하게 AWS를 이용해서 정적 배포를 해봅시다.도메인 구매 후 Route53에 등록하고, HTTPS를 위한 증명서 발급은 미리 되어있다고 가정합니다.1. S3원하는 이름으로 버킷을 생성합니다. 유저들에게 서빙할 html 파일을 저장하는 용도로 사용할 것이기 때문에 버킷에 대한 퍼블릭 액세스를 개방합니다. 나머지 설정은 기본 설정을 따르셔도 좋고, 필요한 부분들을 설정해주시면 됩니다.버킷을 생성했으면 해당 버킷의 속성 탭으로 접근해서 맨 아래의 정적 웹 호스팅을 활성화합니다. 맨 밑의 리다렉션 규칙은 비워둡니다. 이제 권한 탭으로 이동하여 버킷 정책과 CORS 정책을 설정합니다.정책 생성기를 사용할 경우 위 사진과 같이 설정하고, Actions는 GetObject, ARN은 버킷 ARN을 입력합니다.생성..
import syssys.setrecursionlimit(2500) # 재귀 깊이 설정n, m = map(int, input().split())highest = 0mat = []ans = [1, 0]visited = []for _ in range(n): buf = [int(x) for x in input().split()] highest = max(highest, max(buf)) mat.append(buf)def search(row, col, k): global visited if ( row n - 1 or col > m - 1 or visited[row][col] == True or mat[row][col] ans[1]..