아홉번째편
============================
get 은 프로토타입 체인을 따라 검색한다.
set 은 바로 객체에 쓴다.
즉,둘은 비대칭적인면이 있다.
근데 이 문법은 ECMA3 점때 버전에서는 이렇게 했지만 5점때 버전에서는 바꼇다
set은 프로토타입체인을 타고 올라가면서 디크스립터를 가지고 올라온다.
예를들어 , 만약 p라는 속성을 찾는다면 프로토타입체인을 따라 쭉 올라간다. 그래서 이 속성에 디스크립터가 존재를 하는지 하지않는지를 확인을한다.
만약에 존재하지않는다면, 동작을하고,
존재하지않는다면 , writeable 즉 쓰기가 가능한지 확인을 한다.
쓰기가 가능하지않다면 쓸수가 없다.
하지만 쓰기가 가능한다면 바로 객체에다가 쓴다고 합니다.
모든객체에 특정속성을 추가하고 싶을때는,
Object.prototype. 여기서 추가작성하면 된다.
7번 문제>>
function closure(start){
return function count(){
return{
inc: function(){start++;},
get:function(){return start;}
}
}
}
var f1 = closure(0);
var f2 = f1;
var f3 = closure(0);
var fc1 = f1();
var fc2 = f2();
var fc3 = f3();
var fc4 = fc1;
fc1.inc();
fc2.inc();
fc3.inc();
fc4.inc();
var a = fc1.get();
var b = fc2.get();
var c = fc3.get();
var d = fc4.get();
다른문제>
var x = 1;
function innerF(){
return 1+x;
}
function outterF(){
var x =2;
return innerF();
}
console.log(outterF()); //2
동적 스코프(함수실행) <-> 어휘적 스코프(함수정의)
*스코프 정의
-어휘적 유효범위
-최상위는 전역객체
-함수선언 , catch (es3 버전에서)(es6부터는 블록부터 스코프를 만들수있다.)
-중첩 스코프 가능(outter inner 즉 외부함수 내부함수를 뜻함)
다른문제 >>>
function a(){
var i = 0;
function b(){
var i = 1;
function c(){
console.log(i);
}
c();
}
b();
}
a();
함수는 데이터다
즉,
함수를 인자 값으로 넣어줄수도 있고,
함수를 반환할수도 있다.
이런걸 고차함수라고한다.(high order function)
function fn(x){
return function inner(){return x} //함수를 반환받고있는 형태임
};
var f1 = fn(1);
var f2 = fn(2);
console.log(f1());
console.log(f2());
물런 자바스크립트에서는 가비지 콜렉터가 기능은 하지만,
클로져가 있을때는 그 클로져함수의 메모리가 살아있다.
즉, 원래는 리턴하면 종료되어야하는데,
클로져때문에 종료되지않고 계속 살아있는것이다.
그래서
f1 = null;
f2 = null;
이런 식으로 그 함수에 직접 널은 주지않고,
클로저함수를 저장하는 변수에다가 null 값을 다시 할당함으로
메모리를 해제시켜준다.