DEEPDIVE
[JS] DeepDive(22) this
메서드가 자신이 속한 객체의 프로퍼티를 참조하려면 먼저 자신이 속한 객체를 가리키는 식별자를 참조할 수 있어야 한다. 객체리터럴 방식으로 생성한 객체의 경우에는 재귀적 방식으로 자신이 속한 객체를 가리키는 식별자를 참조할 수 있다. // 객체 리터럴 const circle = { radius: 5, getDiameter() { // this는 메서드를 호출한 객체를 가리킨다. return 2 * this.radius; } }; console.log(circle.getDiameter()); // 10 위 예제의 객체 리터럴은 circle 변수에 할당되기 직전에 평가되어 getDiameter메서드가 호출될때 circle 식별자에 생성된 객체가 할당된 이후로 참조할 수 있다. 허나 이 방식은 일반적이지 않고 ..
[JS] DeepDive(19) 프로토타입 -2
function Person(name) { this.name = name; } // 프로토타입 메서드 Person.prototype.sayHello = function () { console.log(`Hi! My name is ${this.name}`); }; const me = new Person('Lee'); // hasOwnProperty는 Object.prototype의 메서드다. console.log(me.hasOwnProperty('name')); // true Person 생성자 함수에 의해 생성된 me 객체는 Object.prototype의 메서드인 hasOwnProperty를 호출할 수 있다. 즉 me객체는 Person.prototype 뿐 아니라 Object.prototype도 상속받았..
[JS] DeepDive(18) 함수와 일급 객체
다음과 같은 조건을 만족하는 객체를 일급 객체라 한다. 1. 무명의 리터럴로 생성할 수 있다. 즉 런타임에 생성이 가능하다. 2. 변수나 자료구조에 저장할 수 있다. 3. 함수의 매개변수에 전달할 수 있다. 4. 함수의 반환값으로 사용할 수 있다. // 1. 함수는 무명의 리터럴로 생성할 수 있다. // 2. 함수는 변수에 저장할 수 있다. // 런타임(할당 단계)에 함수 리터럴이 평가되어 함수 객체가 생성되고 변수에 할당된다. const increase = function (num) { return ++num; }; const decrease = function (num) { return --num; }; // 2. 함수는 객체에 저장할 수 있다. const auxs = { increase, decre..
[JS] DeepDive(17) 생성자 함수에 의한 객체 생성
이전에 소개했던 객체 리터럴 방식은 객체를 생성하기위한 가장 일반적이고 간단한 방식이다. 이번에는 객체 리터럴 방식 말고 생성자 함수를 활용하여 객체를 생성하는 방식에 대해 알아보자. Object 생성자 함수 new 연산자와 함께 Object 생성자 함수를 호출하면 빈 객체를 생성하여 반환한다. // 빈 객체의 생성 const person = new Object(); // 프로퍼티 추가 person.name = 'Lee'; person.sayHello = function () { console.log('Hi! My name is ' + this.name); }; console.log(person); // {name: "Lee", sayHello: f} person.sayHello(); // Hi! My ..
[JS] DeepDive(15) let,const 키워드와 블록 레벨 스코프
ES5까지 변수를 선언할 수 있는 유일한 방법은 var 키워드를 사용하는 것이었다. var 키워드로 선언된 변수는 다음과 같은 특징이 있다. 이 var라는 놈은 아주 독특한 특징으로 주의를 기울이지 않으면 심각한 문제를 발생시킬 수 있다. var x = 1; var y = 1; var x = 100; //중복을 허락함 var y; //초기화문이 없으면 무시됨 console.log(x); //100 console.log(y); //1 위 예제는 var 키워드로 선언한 x변수와 y변수는 중복 선언되었지만 에러가 발생하지 않는다. 함수 레벨 스코프 var 키워드로 선언한 변수는 오직 함수의 코드 블록만을 지역 변수로 인정한다. 따라서 함수 외부에서 var키워드로 선언한 변수는 오직 코드 블록 내에서 선언하더라..
[JS] DeepDive(14) 전역변수의 문제점
전역 변수의 무분별한 사용은 위험한다. 그 이유를 알아보자. 변수는 자신이 선언된 위치에서 생성되고 소멸한다. 전역 변수의 생명 주기는 애플리케이션의 생명 주기와 같다. 하지만 함수 내에서 선언된 지역 변수는 함수의 호출과 종료에 따라 생명주기가 결정된다. 즉, 지역변수의 생명 주기는 함수의 생명 주기와 일치한다. 함수 내부에서 선언된 지역변수는 함수가 생성한 스코프에 등록되며 스코프는 렉시컬 환경이라 불리는 물리적인 실체가 있다고 했다. 따라서 변수는 자신이 등록된 스코프가 소멸될때가지 유효하게 된다. 단, 누군가가 스코프를 참조하고 있다면 그 스코프는 해제되지 않고 생존하게 된다. var x = 'global' function foo() { console.log(x) //? var x = 'local..