목록JavaScript (28)
고리타분한 개발자
Javascript의 모든 함수 스코프에는 arguments라는 특별한 변수가 있습니다. 이 변수는 함수에 넘겨진 모든 인자에 대한 정보가 담겨있습니다. arguments 객체는 Array가 아닙니다. 물론 length 프로미터도 있고 여러므로 Array와 비슷하게 생겼지만 Array.prototype을 상속받지는 않습니다. 그래서, arguments에는 push, pop, slice같은 표준 메소드가 없습니다. 일반 for문을 이용하여 순회할 수는 있지만, Array의 메소드를 이용하려면 arguments를 Array로 변환해야 합니다. Array로 변환하기 다음 코드는 arguments에 있는 객체를 새로운 Array에 담아 반환합니다. Array.prototype.slice.call(argument..
클로저는 Javascript의 특징중 하나입니다. 클로저를 만들면 클로저 스코프안에서 클로저를 만든 외부 스코프에 항상 접을할 수 있습니다. Javascript에서 스코프는 함수 스코프밖에 없기 때문에 기본적으로는 모든 함수는 클로저가 될 수 있습니다. private 변수 만들기 function Counter(start) { var count = start; return { increment: function() { count++; }, get: function() { return count; } }} var monkey = Counter(4);monkey.increment();monkey.get(); // 5 여기서 Counter는 increment 클로저와 get 클로저 두 개를 반환합니다. 이 두 ..
다른 프로그래밍 언어에서 this가 가리키는 것과 Javascript에서 this가 가리키는 것과는 좀 다릅니다. this가 가리킬 수 있는 객체는 정확히 5종류입니다. // 1. Global Scope에서 // Global Scope에서도 this가 사용될 수 있고 이때에는 Global 객체를 가리킵니다.this; // 2. 함수를 호출할 때 // 이때에도 this는 Global 객체를 가리킵니다.// strict 모드에서 더는 Global 객체를 가리키지 않고 대신 undefined를 가리킵니다.monkey(); // 3. 메소드로 호출할 때 // 이 경우에는 this가 test를 가리킵니다.test.monkey(); // 4. 생성자를 호출할 때 // new 키워드로 생성자를 실행시키는 경우에 이 ..
Javascript에서 함수는 First Class Object입니다. 즉, 함수 자체가 또 다른 함수의 인자가 될 수 있다는 말입니다. 그래서, 익명 함수를 비동기 함수의 콜백으로 넘기는 것도 이런 특징을 이용한 일반적인 사용법입니다. 함수 선언 function monkey() {} 위와같이 선언한 함수는 프로그램이 실행하기 전에 먼저 호이스트(Hoist)(스코프가 생성)되기 때문에 정의된 스코프(Scope) 안에서는 어디서든 이 함수를 사용할 수 있습니다. 심지어 함수를 정의하기전에 먼저 함수를 호출하여도 정상 작동 합니다. monkey(); // 이 코드가 실행되기 전에 monkey가 만들어지므로 잘 동작한다.function monkey() {} 함수 표현식 var monkey = function(..
객체의 프로퍼티를 탐색할 때 in 연산자와 마찬가지로 for in 문도 프로토타입 체인까지 탐색합니다. for in 문은 프로토타입 체인을 모두 탐색하기 때문에 상속할 때마다 속도가 더 느려집니다. // Object.prototype에 값을 대입합니다.Object.prototype.monkey = 1; var animal = {tiger: 2};for(var i in animal) { console.log(i); // monkey와 tiger 를 모두 출력합니다.} for in 문에 정의된 기본 동작을 바꿀수는 없기 때문에 루프 안에서 불필요한 프로퍼티를 필터링 해야 합니다. 그래서 Object.prototype의 hasOwnProperty메소드를 이용해 본래 객체의 프로퍼티만 골라냅니다. for in ..
hasownProperty 메소드를 사용하여, 어떤 객체의 프로퍼티가 자기 자신의 프로퍼티인지 아니면 프로토타입 체인에 있는 것인지 확인할 수 있습니다. 그리고, 이 메소드는 Object.prototype으로 부터 상속받아 모든 객체가 가지고 있습니다. hasOwnProperty 메소드는 프로토타입 체인을 탐색하지 않고 프로퍼티를 다룰수있는 유일한 방법입니다. // Object.prototype을 오염시킨다.Object.prototype.monkey = 10;var animal = { dog: undefined }; animal.monkey; // 10'monkey' in animal; // true animal.hasOwnProperty('monkey'); // falseanimal.hasOwnProp..
Javascript는 클래스 스타일의 상속 모델을 사용하지 않고 프로토타입 스타일의 상속 모델을 사용합니다.프로토타입 스타일의 상속 모델의 특징중 하나는 프로토타입 체인을 이용해 상속을 구현한다는 점입니다. function Monkey() { this.value = 10;}Monkey.prototype = { method: function () { }}; function Animal() { } // Monkey의 인스턴스를 만들어 Animal의 prototype에 할당합니다.Monkey.prototype = new Monkey();Animal.prototype.monkey = 'Hello Monkey'; // Animal 함수를 생성자로 만들고Animal.prototype.constructor = Ani..
Javascript에서는null과 undefined를 제외한 모든 것들은 객체처럼 동작합니다. true.toString(); // 'true'false.toString(); // 'false' [1, 2, 3].toString(); // '1,2,3'['a', 'b', 'c'].toString(); // 'a,b,c' function Monkey(){}Monkey.bar = 1;Monkey.bar; // 1 10.toString(); // SyntaxError 코드의 마지막 줄에서는 숫자 리터럴을 객체처럼 사용하려고 하였으나, Javascript에서 Dot Notation이 있는경우 위와같이 SyntaxError로 반환됩니다.하지만, 꼼수를 사용하여 우리는 숫자를 객체처럼 사용할 수 있습니다. 10..t..