Programming/Javascript 10

[Javascript] You Don't Know JS (함수 vs 블록 스코프)

Chapter 3. 함수 vs 블록 스코프 3.1 함수 기반 스코프 각각의 선언된 함수는 저마다의 버블을 생성하지만 다른 어떤 자료구조도 자체적인 스코프를 생성하지 않음 -> 사실이 아님 function foo(a){ var b = 2; //some code function bar(){ //... } //more code var c = 3; } 앞의 코드에서 foo()의 스코프 버블은 확인자 a, b, c와 bar를 포함함 따라서 foo() 바깥에서는 이들에게 접근할 수 없음 bar(); console.log(a, b, c); 하지만 이 모든 확인자 a, b, c, foo, bar는 foo() 안에서 접근할 수 있고, bar() 안에서도 이용할 수 있음 3.2 일반 스코프에 숨기 스코프를 이용해 숨기는 ..

[Javascript] You Don't Know JS (렉시컬스코프)

Chapter 2. 렉시컬 스코프 1장에서 '스코프'를 엔진이 확인자 이름으로 현재 스코프 또는 중첩 스코프 내에서 변수를 찾을 때 사용하는 '규칙의 집합'이라고 정의했음 두 가지 방식 스코프 다른 방식보다 훨씬 더 일반적이고 다수의 프로그래밍 언어가 사용하는 방식(렉시컬 스코프) Bash scripting이나 Perl의 일부 모드와 같은 몇몇 언어에서 사용하는 방식(동적 스코프) 2.1 렉스타임 렉싱 처리 과정에서는 소스 코드 문자열을 분석하여 상태 유지 파싱의 결과로 생성된 토큰에 의미를 부여함 렉시컬 스코프는 렉싱 타임에 정의되는 스코프임 렉시컬 스코프는 개발자가 변수와 스코프 블록을 어디에 작성하는가에 기초해서 렉서가 코드를 처리할 때 확정됨 functio foo(a){ var b = a * 2;..

[Javascript] You Don't Know JS (스코프)

Chapter1. 스코프란 무엇인가 1.1 컴파일러 이론 자바스크립트는 '동적' 또는 '인터프리터' 언어로 분류하나 사실은 '컴파일러 언어'다. 물론 많은 컴파일러 언어처럼 코드를 미리 컴파일하거나 컴파일한 결과를 분산 시스템에서 이용할 수 있는 것 은 아니다. 하지만 자바스크립트 엔진은 전통적인 컴파일러 언어에서 컴파일러가 하는 일의 상당 부분을 우리가 아는 것보다 세련된 방식으로 처리한다. 전통적인 컴파일러 언어의 처리과정에서 소스코드가 실행되기 전에 보통 3단계를 거치는데, 이를 컴파일레이션(Compilation) 이라고 한다. 토크나이징(Tokenizing)/렉싱(Lexing) 문자열을 토큰이라 불리는 의미있는 조각으로 만드는 과정이다. 'var a = 2;' 라는 프로그램은 다음과 같이 나눌 수..

[Javascript] You Don't Know JS (문법-2)

5.2 연산자 우선순위 앞서 설명했지만 자바스크립트에서 &&, || 연산자는 true/false를 반환하는 것이 아닌 피연산자 중 하나를 선택해서 반환한다. var a = 42; var b = "foo"; a && b; // "foo" a || b; // 42하지만 연산자 2개, 피연산자 3개면? var a = 42; var b = "foo"; var c = [1,2,3]; a && b || c; // ??? a || b && c; // ???두 표현식의 결과를 이해하려면 연산자와 피연산자가 여러 개 있을 경우 어떤 규칙으로 처리되는지 알아야 한다. 이 규칙을 '연산자 우선순위'라고 한다. 앞서 살펴봤던 예제이다. var a = 42, b; b = ( a++, a ); a; // 43 b;..

[Javascript] You Don't Know JS (문법)

Chapter 5. 문법 5.1 문과 표현식 3 * 6은 표현식이며, 각 줄은 표현식(Expression)이 포함된 문(Statement)이다. var a = 3 * 6; var b = a; b; 5.1 문의 완료 값 모든 문은 완료 값을 가진다. var a = 42를 콘솔창에 입력했을 때, 42 대신 undefined가 출력된다. (var 자체의 완료 값) { } 블록은 내부의 가장 마지막 문/표현식의 완료 값을 자신의 완료 값으로 반환하기 때문에 아래는 42가 출력된다. var b; if (true) { b = 4 + 38; }그렇지만 아래와 같은 코드는 동작하지 않는다. 문의 완료 값을 다른 변수에 할당한다는 건 쉬운? 구문/문법으론 불가능하다. var a, b; a = if (true) { b =..