코드스피츠 74 2회차
함수를 작성할때에 참조에 대해서 충분히 고민해야 된다.
참조를 인자로 보내면 위험하다.
call 스택 -> 지역변수, 인자, 함수의 참조주소
tail recursion(꼬리물기 최적화) -> 메모리 고갈을 방지함 -> 자바스크립트는 ES6에 표준(사파리에서만 작동)
1 2 3 4 5 6
|
const sum = v => v + (v>1 ? sum(v-1) : 0);
sum(3);
|
1 2 3 4 5 6 7 8 9
|
const sum = (v, prev = 0 )=> { prev +=v; return (v>1 ? sum(v-1,prev) : prev); };
sum(3);
|
1 2 3 4 5 6 7 8 9 10 11 12 13
|
const sum = (v)=> { let prev +=v; while (v>1){ prev += v; v--; } return prev; };
sum(3);
|
위에 까지는 정적함수 개념을 배운것
closure
자유변수 : free variables 루틴안에 있는 지역변수도 아니고 글로벌 변수도 아닌데 사용할수 있음
nested closure(중첩된 클로저)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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(클로저에서 자유변수로 접근을 막기 위해서 사용한다.)
1 2 3 4 5 6 7 8 9 10
| const a =3; if(a == 3){ const a =5; const f1 = v=>{ const a = 7; console.log(a); } }
|
co routine(여러번 진입하고 반환하는 것)
메모리 지속을 위해서 코루틴을 사용.
절차가 중요한것에서 사용함
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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 있어서
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 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);
|
기존 프로토타입 체인으로 어떻게 될지 잘모르니 좌절 사람들 설명을 보고 나서 대충 감이…
어렵다 ㅜㅜ
참조