[[TableOfContents]] * 강의 노트는 날짜나 요일 별로 구분하지 않고 큰 주제별로 분리할 생각입니다. 그렇게 하는 편이 나중에 찾아보기에 좋을것 같습니다 -[안혁준] * 저의 주관적인 부분이 많이 들어 갈수 있으므로 부족하다 생각되는 부분은 채워주세요. * 강의 노트는 같이 만들어 나가는 것이므로 모두들 함께 채워나갑시다. == JavaScript란? == === Prototype 기반 언어 === * prototype언어? * oop의 흐름은 class와 prototype으로 나늰다. * prototype은 클래스가 들고 있어야하는 함수들을 특정 인스턴스가 들고 있게 만드는 것이다. * 이 특정 인스턴스를 prototype이라 부른다. === 함수형 언어 === * 함수를 일급객체로 다루는 언어 * 일급객체란? * 변수 안에 담을수 있고, * 파라미터로 전달할수 있으며, * 반환값을 사용할수 있고 * 할당된이름과 관계없이 구분할수 있다 == Javascript 문법 == === 클로져 === * 클로져 : 내부의 있는 외부에 있는 함수의 지역 변수를 쓸수 있는것. 때문에 의도하지 않은 결과를 가져올수 있다. === prototype === ==== Class vs Prototype ==== * Class : 함수와 맴버 변수가 각각 class와 인스턴스에 나누어 져있는것. * prototype : 함수와 맴버 변수 모두 인스턴스에 저장되있는것 * 단지 함수는 다른 인스턴스에 존재한다. * 그 다른 인스턴스는 prototype이라 부른다. class <-----------------> prototype VTable <-----------------> prototype chain (__proto__) ==== 상속 ==== * 상속을 위해서는 prototype chain에 등록하면 된다. {{{ function People(){}; function Man(){}; Man.prototype = new People(); m = new Man(); }}} === Excuteion Context === * this * p.do() 에서 p가 실행문맥이다. 그러나 이 함수를변수로 받으면 var f = p.do; f(); 이런식으로 그러면 f는 실행문맥이 없기 때문에 전역객체가 실행문맥으로 간주된다. * 결론적으로 함수 앞 마지막 . 앞에 있는 것이 중요하다. * func.apply(ec, arguments) 나 func.call(ec, arg1, arg2, ... )으로 func안에서의 실행문맥(this)를 변경할수 있다. === new의 동작 === * new Person(); * 1. create instance * 2. instance.__proto__ = Person.prototype; * 이때의 __proto__는 프로토타입 체인이라 할수있다.(엔진별로 다를수 있다.) * 3. 실행문맥을 instance로 한 생성자를 호출한다. === dispatch === * 실제 호출해야 하는 함수를 찾는 과정 * javascript에서는 실행시간에 프로토타입 체인에 의해 실행한다. * instance의 __proto__에서 찾고 없으면 그위에 __proto__에서 찾고...