0%

201127_TIL(함수)

오늘 한 것

이진 검색 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function binarySearch(array, target) {
var start = 0;
var end = array.length - 1;
var mid = Math.floor((start + end) / 2);

while (start <= end) {
mid = Math.floor((start + end) / 2);
if (target > array[mid]) {
start = mid + 1;
} else if (target < array[mid]) {
end = mid - 1;
} else if (target === array[mid]) return mid;
}
return -1;
}

console.log(binarySearch([1, 2, 3, 4, 5, 6], 1)); // 0
console.log(binarySearch([1, 2, 3, 4, 5, 6], 3)); // 2
console.log(binarySearch([1, 2, 3, 4, 5, 6], 5)); // 4
console.log(binarySearch([1, 2, 3, 4, 5, 6], 6)); // 5
console.log(binarySearch([1, 2, 3, 4, 5, 6], -1)); // -1
console.log(binarySearch([1, 2, 3, 4, 5, 6], 0)); // -1
console.log(binarySearch([1, 2, 3, 4, 5, 6], 7)); // -1
  • 시간 복잡도: O(log n)
  • 좀 더 간결하게 코드를 정리해보자. 이왕이면 재귀함수로도 구현해보자

함수

매개변수의 최대 개수

매개변수의 개수가 많아진다면 매개변수에 객체로 전달하는 것이 좋다. → 객체는 프로퍼티 키를 통해 접근하니 순서가 상관없다. → 단점으로는 객체는 변경 가능한 값이라 불안정할 수 있다.

반환문

1
2
3
4
5
function add(x, y) {
return x + y; // 함수에 return이 없다면 암묵적으로 undefined를 반환한다.
}

var res = add(1, 2); // 함수를 호출할 때는 반환값을 할당할 변수가 필요하다

참조에 의한 전달과 외부 상태의 변경

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 매개변수 primitive는 원시값을 전달받고, 매개변수 obj는 객체를 전달받는다.
function changeVal(primitive, obj) {
primitive += 100;
obj.name = "Kim";
}

// 외부 상태
// 변수로 할당했다는 것은 재사용 의도가 있다는 것이다.
var num = 100;
var person = { name: "Lee" };

console.log(num); // 100
console.log(person); // {name: "Lee"}

// 원시값은 값 자체가 복사되어 전달되고 객체는 참조값이 복사되어 전달된다.
changeVal(num, person);

// 원시값은 원본이 훼손되지 않는다.
console.log(num); // 100

// 객체는 원본이 훼손된다.
console.log(person); // {name: "Kim"}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 매개변수 primitive는 원시값을 전달받고, 매개변수 obj는 객체를 전달받는다.
function changeVal(primitive, obj) {
primitive += 100;
obj.name = "Kim";
}

// 재사용 의도가 없다면 변수에 할당하지 말자.
// var num = 100;
// var person = { name: 'Lee' };

console.log(num); // 100
console.log(person); // {name: "Lee"}

// 값을 직접 넣어주면 외부 상태의 영향을 받을 일이 없다.
changeVal(100, { name: "Lee" });

즉시 실행 함수

즉시 실행 함수(IIFE)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 익명 즉시 실행 함수
(function () {
var a = 3;
var b = 5;
return a * b;
})();

// ( 그룹 연산자: 값으로 평가될 수 있는 표현식을 감싼다.
// 함수 리터럴
function () {
var a = 3;
var b = 5;
return a * b;
}
// )
// () 호출
  1. let, const 등장 전 전역변수 방지를 위한 스코프 역할로 사용했다.
  2. 클로저(closure)와 관련되어 사용한다.

즉시 실행 함수를 여러번 사용할 경우 → 즉시 실행 함수를 쓸 이유가 없다.

재귀 함수

재귀함수는 StackOverFlow 에러에 취약하다. for문과의 가독성 등을 잘 비교해서 더 나은 경우에만 쓰는 것이 좋다.

많이 쓰이지는 않지만 트리 탐색 및 깊은 복사할 때 사용된다.

중첩 함수

JS에서 중요한 개념이다.

전역 스코프에서 함수가 실행될 때 runtime 이전에 함수 스코프를 평가한다. 이때 변수, 내부 함수 등이 호이스팅된다.

외부 함수 내부에 중첩된 함수는 외부 함수라는 스코프에 한정된 함수라는 것이다.

콜백 함수

1
2
3
4
5
6
7
8
9
10
11
// 고차함수
function repeat(n, f) {
for (var i = 0; i < n; i++) f();
}

// 콜백함수
function foo() {
console.log("hello");
}

repeat(5, foo);

고차함수: 인수로 함수를 받거나 리턴값으로 함수를 반환하는 함수

콜백함수: 매개변수를 통해 다른 함수 내부로 전달되는 함수

순수 함수와 비순수 함수

객체의 메서드는 프로퍼티를 잠조하고 조작하기 때문에 기본적으로 비순수 함수이다.

함수형 프로그램의 이상향은 순수 함수만을 사용하며 코딩하는 것이다.

Nyong’s GitHub