내부 슬롯과 내부 메서드 앞으로 나올 프로퍼티 어트리뷰트를 이해하기 위하여 내부 슬롯과 내부 메서드 개념에 대해 알아보자 내부 슬롯과 내부 메서드는 자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 ECMAScript 사양에서 사용하는 pseudo property, pseudo method이다. 내부 슬롯과 내부 메서드는 ECMAScript 사양에 정의된 대로 구현되어 자바스크립트 엔진에서 실제로 동작하지만 개발자가 직접 접근할 수 있도록 외부로 공개된 객체의 프로퍼티는 아니다. 즉, 내부 슬롯과 내부 메서드는 자바스크립트 엔진의 내부 로직이므로 원칙적으로 직접 접근하거나 호출할 수 있는 방법을 제공하지 않는다. 단, 일부 내부 슬롯과 내부 메서드에 한하여 간접적으로 접근할 수 있는 수단을 제공하기는 한..
let, const키워드와 블록 레벨 스코프 1. var 키워드로 선언한 변수의 문제점 1.1. 변수 중복 선언 허용 var키워드로 선언한 변수는 중복 선언이 가능하다. var x = 1; var y = 1; var x = 100 // 중복 선언 var y; // 중복 선언 console.log(x); // 100 console.log(y); // 1 위의 예는 var키워드로 선언한 변수는 중복 선언이 가능하다는 것을 보여준다. 신기하게도, var y; 가 실행되어 undefined가 있을 것 같지만, 아니다. 이는 중복 선언에 있어서 초기화문이 있는 변수 선언문은 자바스크립트 엔진에 의해 var이 없는 것처럼 동작하지만, 초기화 문이 없는 선언문은 무시된다. 이 때 에러는 없다. var x = 1; v..
전역 변수의 문제점 전역 변수의 사용은 어느 프로그래밍 언어이든지 위험하다. 이번 편에서는 자바스크립트에서 발생하는 전역 변수의 문제점들을 살펴보도록 하자 1. 변수의 생명 주기 변수는 선언에 의해 생성되고, 할당을 통해 값을 갖는다. 그리고 소멸하게 된다. 그렇다면 언제 소멸하고 생겨날까?? 지역 변수의 경우에는 함수가 실행되면 선언이 되고, 런타임에 값이 할당된다. 또한 함수가 종료되면 지역 변수가 사라지게 된다. function foo(){ var x = "local"; console.log(x); return x; } foo(); console.log(x) // error 이전에 변수 선언의 실행 시점과 변수 호이스팅에 관해 말하였는데, 이때 변수 선언은 선언문이 어디에 있던지 상관없이 가장 먼저..
스코프(scope) 1. 스코프란? scope는 자바스크립트 뿐만 아니라, 여러 프로그래밍 언어에서 사용되는 개념이다. 그런데 특별히 자바스크립트에서 유별난 특징이 있어 잘 배워두어야 한다. var, let 또는 const 키워드로 선언한 변수의 스코프는 다르게 동작한다. 즉, 스코프는 변수 그리고 함수와 깊은 관련이 있다. 함수는 함수 몸체 내부에서만 참조할 수 있고, 함수 몸체 외부에서 함수 내부의 변수를 사용하는 것은 불가능하다. 이것은 매개변수를 참조할 수 있는 유효범위, 즉 매개변수의 스코프가 함수 몸체 내부로 한정되기 때문이다. function add(x,y){ console.log(x,y); return x+y; } add(2,5); console.log(x,y)// error 이처럼 함수 ..
함수 1. 함수란? 자바스크립트에서 함수란 굉장히 중요한 개념이다. 단순히 c/c++ , java에서 보이는 함수와는 달리 자바스크립트에서의 핵심 개념인 스코프, 실행 컨텍스트, 클로저, this, 프로토타입, 모듈화 등이 있다. 힘수의 선언(정의)은 다음과 같다. function add(x,y){ return x + y; } 따로 함수의 반환 타입, 매개변수 타입을 안써주어도 된다. 2. 함수 리터럴 자바스크립트에서 함수는 객체 타입이다. 따라서 객체 리터럴도 객체를 생성할 수 있는 것처럼, 함수도 함수 리터럴로 생성할 수 있다. 함수 리터럴은 function 키워드, 함수 이름, 배개 변수 목록, 함수 몸체로 구성된다. var func = function add(x, y){ return x + y; ..
원시 값과 객체의 비교 1. 원시 타입과 객체 원시타입을 가지는 원시 값은 변경 불가능한 값이다. 반면에 객체 타입의 값, 즉 객체는 변경 가능한 값이다. 원시 값을 변수에 할당하면, 변수에는 실제 값이 저장된다. 이에 비해 객체를 변수에 할당하면 변수에는 참조 값이 저장된다. 이는 어떤 차이를 보이냐면, 원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원시 값이 복사되어 전달된다. 이를 값에 의한 전달(pass by value)라고 한다. 이에 비해 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달된다. 이를 참조에 의한 전달( pass by reference )라고 한다. 2. 원시 타입 여기서 중요한 것은 원시 타입의 값을 갖는 변수가 값을 바꾸지 못한다는 것은 변수가..
객체 리터럴 1. 객체란?? 자바스크립트에서는 원시 값 빼고는 모두 객체로 사용된다. 즉, 함수, 정규 표현식, 배열 등 모두 객체로 구성되어있다. 또한, 객체는 원시 값과는 달리 immutable이 아닌, mutable한 값이다. 이는 추후에 다시 배워보도록 하자 자바스크립트에서의 객체 표현은 다음과 같다. var person = { name: 'lee', // key - value age : 20 // key - value } person이라는 객체를 생성한 것이다. 객체는 property로 이루어지는데, name : 'lee' 와 age: 20 을 각각 property라고 부른다. 여기서 property는 key : value 형식을 띈다. 재밌는 것은 굳이 변수를 선언..
타입 변환과 단축 평가 1. 타입 변환 명시적 타입 변환 ( 타입 캐스팅 ) : 개발자가 의도적으로 타입을 변환하는 것이다. 암묵적 타입 변환 ( 타입 강제 변환, type conversion) : 자바스크립트 엔진에 의해 실행 도중에 타입이 변환되는 것을 말한다. 한 가지 명심해야 할 것은 명시적 타입 변환이나 암죽적 타입 변환이나 기존 원시 값을 직접 변경하는 것은 아니다. 원시 값은 immutable한 값이기 때문에 변경이 불가능하다. 단지, 다른 타입의 새로운 값을 생성하는 것이다. var temp = 1; console.log(typeof temp.toString()); // string console.log(typeof temp) // Number 위는 명시적인 타입 변환에 해당한다. 그러나,..