함수는 값으로 취급하며 이를 변수에 저장하거나, 인수로 전달하거나, 다른 함수의 결과로 반환할 수 있다.
result = [0, 1, 4].map(Math.sqrt) // [0, 1, 2]
map 메서드처럼 다른 함수를 소비하는 메서드를 고차함수(higher-order function)라 한다.
객체리터럴을 반환하는 화살표함수는 괄호로 객체를 감싸야한다. 그렇지 않으면 중괄호를 블럭으로 인식한다.
const stats = (x, y) => ({
average: (x + y) / 2,
distance: Math.abs(x -y)
})
forEach 메서드는 결과를 반환하지 않으므로 forEach에 전달한 함수는 반드시 부작용을 포함해야 한다.
arr.forEach((element, index) => { console.log(`${index}: ${element}`) })
map, filter, join 메서드는 값을 반환하거나 부작용을 일으키지 않는 상황
const enclose = (tag, contents) => `<${tag}$>{contents}</${tag}>`
const listitems = item.map(i=> enclose('li', i))
const sayLater (text, when) => {
let task = () => console.log(text)
setTimeout(task, when)
}
sayLater('Hello', 1000)
sayLater('Goodbye', 1000)
함수는 1.코드블록, 2.매개변수, 3.자유변수 free variable (매개변수나 지역변수로 선언죄디 않은 다른 변수 ) 로 구성되어 있다.
자유변수를 포함하는 함수를 클로저 closure 라 한다.
let text = 'Goodbye'
setTimeout(() => console.log(text), 1000)
text = 'Hello'
/// Hello
하드객체 hard object = 클로저 패턴 = 팩토리 클래스 패턴
const createAccount = (initialBalance) => {
let balance = initialBalance + 10
return {
deposit: (amount) => {
balance += amount
},
withdraw: (amount) => {
if (balance >= amount) balance -= amount
},
getBalance: () => balance
}
}
'use strict'
모든 변수 선언
NaN, undefined 에 값을 할당할 수 없다
함수는 스크립트나 함수의 가장 최상위 수준에서만 선언
유효한 식별자에서만 delete 연산사용
매개변수 중복 불가
형식 | 검사 |
---|---|
문자열 | typeof x==='string' || x instanceof String |
정규표현식 | x instanceof RegExp |
숫자 | typeof x==='number' || x instanceof Number |
숫자로 변환가능한 모든 형식 | typeof +x==='number' |
배열 | Array.isArray(x) |
함수 | typeof x==='function' |
const average = (x=0, y=x) => (x+y)/2
let numbers = [1, 2, 3, 4]
Math.max(...numbers) // 스프레드 연산자
const [first, ... others] = numbers // 나머지 매개변수 선언
자바스크립트에는 인수에 이름을 붙이는 기능을 지원하지 않지만, 객체리터럴을 이용하여 흉내낼수 있다.
const mkString = (array, {
separator = ',',
leftDelimiter = '[',
rightDelimiter = ']'
} = {}) => {
...
}
자바스크립트의 모든 선언은 범위의 가장 윗부분으로 호이스팅 hoisting 된다
엄격모드를 사용하면서 var 을 사용하지 않으면 호이스팅으로 인해 오류가 발생할 가능성이 크게 줄어든다.
이전엔 즉시함수호룰 을 이용해 범위를 제한했다.
(function () {
var someVariable = 33
function someFunction(...) { ... }
...
})() // () 를 이용해 여기서 함수호출
// somevariable, someFunction 은 더 이상 범위에 없음
요즘엔 간단하게 아래처럼 익명함수를 선언하고, 범위는 븍록내로 제한된다.
{
let someVariable = 33
const someFunction = (...) => { ... }
...
}
함수가 결과를 계산할 수 없을 때에는 NaN 이나 undefined 보다 예외를 던지는 것이 좋다.
finally 절은 반드시 실행되고 return/break/throw 를 추가하면 혼란이 발생한다.
try {
// 작업처리
} catch (e) {
console.log(e)
throw e
} finally {
// 자원해제등 작업
...
}
function indexOf(arr, value) {
for (let i in arr ) {
if (arr[i] === value) return i
}
return -1
}
indexOf({'prop1':3, prop2:4}, 3) // 'prop1'
indexOf({'prop1':3, prop2:4}, 1) // -1
// 양의 정수 내림차순
[1, 3, 5, 6].sort((x,y) => y - x )
// 사람을 연령 오름차순
[{'name':'john', 'age': 11}, {'name':'petti', 'age': 13}, {'name':'merian', 'age': 10}].sort((x,y) => x.age - y.age )
// 문자열 오름차순
['abc', 'bcde', 'abcd', 'abc'].sort()
// 문자열 내림차순
['abc', 'bcde', 'abcd', 'abc'].sort((x,y) => x > y ? -1 : (x < y ? 1 : 0))