- 화살표함수
- 싱글톤 패턴
- arguments 객체
- this 키워드
- call/apply/bind
- rest / spread 문법
@@ 오늘은 정말 많은 개념들을 배운 것 같다. urclass에서 문서를 읽으며 습득한 내용도 많고, koans를 페어랑 진행하면서 여러가지 개념들을 익혔다. 특히 아직도 헷갈리는 this의 5가지 패턴 이외의 예외 상황들(화살표 함수, 이벤트리스너, forEach등 thisArg를 인자로 받는 함수들)에 대해서 많이 익혔고(물론 아직 헷갈리지만..), spread 문법에 대해서 다양하게 눈에 익히고 문제를 풀어봤다는 게 나름의 성과였다. 객체 구조 분할 문법도 대강은 알고 있었지만, default 값을 설정하는 것이나 변수명을 새로운 이름으로 설정하여 분할하는 법 등을 제대로 모르고 있었던 것 같다. 문제를 풀며 익힐 수 있어서 좋았다.
call/apply/bind에 대해서도 여러가지 활용법에 대해서 생각해보고 익혀보는 시간을 가졌는데, 특히 bind는 정말 활용도가 높아서 적재적소에 내가 쓸 수 있도록 머리에 익히고, 손에 익히는 시간이 필요할 것 같다는 생각이 든다.
아직은 시간이 조금 더 필요하지만, 책도 책이고 정리한 노트를 계속 복습해서 this, call/apply/bind, spread 문법에 대해선 꼭 내가 가져가야겠다는 생각이 많이 든다. 복습만이 살길이다!
window.x = 1;
const normal = function () { return this.x; };
const arrow = () => this.x;
console.log(normal.call({ x: 10 })); // 10
console.log(arrow.call({ x: 10 })); // 1
화살표 함수로 메서드를 정의하는 것은 피하는 것이 좋다.
화살표 함수는 this 를 결정짓지 않기 때문에 메서드 정의 시 , this 가 해당 객체를 바라보지 않고, 그 상위 컨텍스트의 this 를 바라보기 때문에 의도치 않은 결과를 초래할 수 있다.
이는 prototype 메서드를 정의할 때 또한 마찬가지이다.
화살표 함수는 생성자 함수로 사용할 수 없다. 화살표 함수를 생성자 함수로 이용하면 생성자가 아니라는 오류를 반환한다.
addEventListener 함수를 사용할 때도 같은 이유로 일반 함수를 사용하는 것이 좋다. 일반 함수를 사용해야 this 가 이벤트에 바인딩된 요소 currentTarget을 가리킨다.
참고: Arrow function
싱글턴은 필요에 의해 단 하나의 객체만을 만들 때 사용합니다.
var obj = {
a: 'hello',
b: function() {
alert(this.a);
}
};
참고 : 제로초 블로그, 디자인 패턴(싱글턴, 모듈, 생성자)
arguments 객체
함수는 전달받은 매개변수를 특정한 객체 arguments를 담고 있다.
유사배열 형태를 띈다
arguments.callee 속성(property)
현재 실행 중인 함수를 가리킨다.
ES5은 엄격 모드에서 arguments.callee()의 사용을 금한다.
arguments.caller
arr.forEach(callback(currentvalue[, index[, array]])[, thisArg])
thisArg 매개변수를 forEach()에 제공한 경우 callback을 호출할 때 전달해 this의 값으로 쓰입니다.
전달하지 않으면 undefined를 사용하며, 최종 this 값은 함수의 this를 결정하는 평소 규칙을 따릅니다.
이벤트 리스너
setTimeout의 첫번째 인자에 익명함수를 넣으면 this가 window를 가리킨다.
global 객체
call과 bind 는 thisArg 인자 뒤에 인자를 개별 요소로 , apply 는 array 형태로 받는다.
배열을 spread 연산자로 활용해 Math.max 메소드 사용
Math.max(...arr)
유사 배열일 경우
Math.max.apply(null, array)
( apply는 인자를 배열의 형태로 받기 때문에 spread 형태가 아닌 그냥 배열을 사용한다)
prototype 의 기능 또한 빌려쓸 수 있다.
var foo = ["one", "two", "three"];
var [one, two, three] = foo;
console.log(one); // "one"
console.log(two); // "two"
console.log(three); // "three"
var a, b;
[a=5, b=7] = [1];
console.log(a); // 1
console.log(b); // 7
var a = 1;
var b = 3;
[a, b] = [b, a];
console.log(a); // 3
console.log(b); // 1
function f() {
return [1, 2, 3];
}
var [a, , b] = f();
console.log(a); // 1
console.log(b); // 3
//모두 무시하기
[,,] = f();
var o = {p: 42, q: true};
var {p, q} = o;
console.log(p); // 42
console.log(q); // true
({a, b} = {a:1, b:2}) //var {a, b} = {a:1, b:2}
{a, b} = {a:1, b:2}는 유효한 독립 구문이 아니다. 좌변의 {a, b}의 객체 리터럴이 아닌 블록으로 간주되기 때문이다.
({a, b} = {a:1, b:2})는 var {a, b} = {a:1, b:2}와 일치한다.
({a, b} = {a:1, b:2}) 표현식 앞에는 세미콜론이 있어야 한다.
새로운 변수 이름으로 할당
var o = {p: 42, q: true};
var {p: foo, q: bar} = o;
console.log(foo); // 42
console.log(bar); // true
var {a = 10, b = 5} = {b: 3};
console.log(a); // 10
console.log(b); // 3
var {a: aa = 10, b: bb = 5} = {a: 3};
console.log(aa); // 3
console.log(bb); // 5
function drawES2015Chart({size = 'big', cords = { x: 0, y: 0 }, radius = 25} = {}) {
console.log(size, cords, radius);
// 차트 그리기 수행
}
drawES2015Chart({
cords: { x: 18, y: 30 },
radius: 30
});
var metadata = {
title: "Scratchpad",
translations: [
{
locale: "de",
localization_tags: [ ],
last_edit: "2014-04-14T08:43:37",
url: "/de/docs/Tools/Scratchpad",
title: "JavaScript-Umgebung"
}
],
url: "/en-US/docs/Tools/Scratchpad"
};
var { title: englishTitle, translations: [{ title: localeTitle }] } = metadata;
console.log(englishTitle); // "Scratchpad"
console.log(localeTitle); // "JavaScript-Umgebung"
let key = "z";
let { [key]: foo } = { z: "bar" };
console.log(foo); // "bar"
key 값에 대괄호로 변수를 담아서 활용할 수 있다.
객체의 key 값이 자바스크립트 식별자 명에 부합하지 않는 키값일 경우, 구조 분해를 활용하려면 다른 변수 명으로 바꿔서 사용해야 한다.