코드스피츠 74 2회차
함수를 작성할때에 참조에 대해서 충분히 고민해야 된다.
참조를 인자로 보내면 위험하다.
call 스택 -> 지역변수, 인자, 함수의 참조주소
tail recursion(꼬리물기 최적화) -> 메모리 고갈을 방지함 -> 자바스크립트는 ES6에 표준(사파리에서만 작동)
// 연산스택 때문에 스택을 해제 할수 없다.(+)
const sum = v => v + (v>1 ? sum(v-1) : 0);
sum(3);
// 인자로 이관해서 꼬리 물기 최적화
const sum = (v, prev = 0 )=> {
prev +=v;
return (v>1 ? sum(v-1,prev) : prev);
};
sum(3);
// 재귀함수는 먼저 꼬리물기 최적화로 바꿈 loop로 빠꿈
const sum = (v)=> {
let prev +=v;
while (v>1){
prev += v;
v--;
}
return prev;
};
sum(3);
위에 까지는 정적함수 개념을 배운것
closure
자유변수 : free variables 루틴안에 있는 지역변수도 아니고 글로벌 변수도 아닌데 사용할수 있음
nested closure(중첩된 클로저)
window.a =3;
if(a == 3){
const b= 5;
const f1 = v =>{
const c = 8;
if(a+b>c){
return p => v + p + a + b + c;
}else{
return p => v + p + a + b;
}
};
}
자유변수를 쓰는 이유는 함수자체에서 제공 받는 객체가 필요해서 사용한다.
shadowing(클로저에서 자유변수로 접근을 막기 위해서 사용한다.)
const a =3;
if(a == 3){
const a =5;
const f1 = v=>{
const a = 7;
console.log(a);
}
}
co routine(여러번 진입하고 반환하는 것)
메모리 지속을 위해서 코루틴을 사용.
절차가 중요한것에서 사용함
const generator = function*(a) {
a++;
yield a;
a++;
yield a;
a++;
yield a;
};
const coroutine = generator(3);
let result = 0;
result+= coroutine.next().value;
console.log(result);
result+= coroutine.next().value;
console.log(result);
result+= coroutine.next().value;
console.log(result);
//축약을 위해 아래처럼 사용되기도 함
const a = {*_(){}};
const b = a._();
숙제 es6에서 진짜 배열을 상속 받아서 구현 할수 있는이유 super 있어서
class TestArray extends Array {
constructor(...args) {
super(...args);
}
}
const a = new TestArray(2);
console.log(a.length);
//배열 연산자를 뺄수 있는 경우가 ㅜㅜ
function TestArray(...args) {
var inst = new Array(...args);
inst.__proto__ = TestArray.prototype;
return inst;
}
TestArray.prototype = Object.create(Array.prototype);
var a = new TestArray('1','2');
console.log(a.length);
기존 프로토타입 체인으로 어떻게 될지 잘모르니 좌절 사람들 설명을 보고 나서 대충 감이…
어렵다 ㅜㅜ