모던 자바스크립트 Deep Dive 27

[HUFS/GnuVil] #7 전역변수의 문제점, 블록 레벨 스코프

전역변수의 문제점 var x = 'global'; function foo() { console.log(x); // ① var x = 'local'; } foo(); console.log(x); // global 전역변수의 생명주기는 전역객체의 생명주기와 일치한다 전역변수는 다음과 같은 문제점들이 있다 암묵적 결합: 모든 코드가 전역 변수를 참조하고 변경할 수 있는 암묵적 결합(implicit coupling)을 허용하며, 유효 범위가 클수록 가독성이 나빠지고 의도치 않은 상태 변경의 위험도 커진다 긴 생명 주기: 긴 생명 주기동안 메모리 리소스를 오래 소비하며 그동안 의도치 않은 재할당이 이루어질 수 있다 스코프 체인 상에서 종점에 존재: 변수를 검색할 때, 전역 변수가 가장 마지막에 위치해 검색 속도가..

[HUFS/GnuVil] #6 실행 컨텍스트, 스코프

실행 컨텍스트 실행 컨텍스트는 식별자(변수, 함수, 클래스..)를 등록하고 관리하는 스코프와 코드 실행 순서 관리를 구현한 내부 메커니즘으로, 모든 코드는 실행 컨텍스트(Execution Context)를 통해 실행되고 관리된다 실행 컨텍스트는 코드 실행 순서를 스택(Stack) 자료구조로 관리한다 const x = 1; function foo () { const y = 2; function bar () { const z = 3; console.log(x + y + z); } bar(); } foo(); // 6 식별자와 식별자에 바인딩된 값, 상위 스코프에 대한 참조는 렉시컬(Lexical) 환경으로 관리한다 렉시컬 환경은 함수를 어디서 호출했는지가 아닌, 어디에 정의했는지에 따라 상위 스코프를 결정한..

[HUFS/GnuVil] #5 함수

함수 // 함수 선언문 function add(x, y) { return x + y; } 함수 선언문은 생성된 함수 이름과 동일한 식별자를 암묵적으로 생성하고 함수 객체를 할당한다 // 함수 표현식 (함수 리터럴을 변수에 할당) var sub = function (x, y) { return x - y; }; 자바스크립트 함수는 객체 타입의 값으로, 함수 리터럴로 생성해 변수에 할당할 수도 있다 * 함수 선언문은 표현식이 아닌 문으로 변수에 할당할 수 없다! // 함수 선언문은 함수 이름을 생략할 수 없다. function (x, y) { return x + y; } // SyntaxError: Function statements require a function name 함수 선언문은 이름을 생략할 수 ..

[HUFS/GnuVil] #4 객체 리터럴, 원시 값과 객체의 비교

객체 리터럴 자바스크립트는 객체 기반의 프로그래밍 언어이며, 원시 값을 제외한 나머지 값 (함수, 배열, 정규 표현식 등)은 모두 객체이다. 또한 원시 값은 변경 불가능(immutable)한 값이지만 객체는 변경 가능(mutable)한 값이다 프로퍼티: 객체의 상태를 나타내는 값(data) 메서드: 프로퍼티(상태 데이터)를 참조하고 조작할 수 있는 동작(behavior) var person = { name: 'Lee' }; // 마침표 표기법에 의한 프로퍼티 접근 console.log(person.name); // Lee // 대괄호 표기법에 의한 프로퍼티 접근 console.log(person['name']); // Lee 프로퍼티는 두 가지 방법으로 접근할 수 있다 * 대괄호 표기법의 경우 키는 반드..

[HUFS/GnuVil] #2 데이터 타입, 연산자

데이터 타입 일반 문자열에서는 줄바꿈 등의 공백을 표현하려면 이스케이프 시퀀스를 사용해야 한다 var template = '\n\tHome\n'; var template = ` Home `; 템플릿 리터럴 내에서는 줄바꿈이나 공백이 있는 그대로 적용된다 undefined는 할당된 값이 아닌 자바스크립트 엔진이 변수를 초기화 할 때 사용하는 값이며 null은 변수에 값이 없다는 것을 의도적으로 명시(intentional absence)한다 // 심벌 값 생성 var key = Symbol('key'); console.log(typeof key); // symbol // 객체 생성 var obj = {}; // 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용한다. obj[key] = '..

[HUFS/GnuVil] #1 변수, 표현식과 문

변수 10 + 20 자바스크립트 엔진은 위 자바스크립트 코드를 계산(=평가, evaluation)하기위해 리터럴(literal)과 연산자(operator)의 의미를 알고 있어야 하며 표현식(expression)의 의미도 해석(=파싱, parsing)할 수 있어야 한다. 이 때 메모리를 사용해 피연산자를 기억하며, 연산은 CPU를 통해 이루어진다 각 셀은 고유의 메모리 주소를 가지며 모든 데이터를 2진수로 처리한다 재사용을 위해 메모리 주소로 직접 연산 결과에 접근하는 것은 시스템에 치명적인 오류를 발생시킬 수 있다. 따라서 변수(variable)를 활용해 하나의 값을 저장하기 위한 메모리 공간 확보 및 식별하기 위한 이름을 붙인다. 이는 컴파일러 또는 인터프리터에 의해 메모리 공간의 주소로 치환되어 실행..