이 내용은 이웅모님의 모던 자바스크립트 Deep Dive 책을 공부하고 정리한 내용입니다. (기본 개념부터 심화까지 아주 좋은 책입니다!)
모던 자바스크립트 Deep Dive
💡 함수의 정의와 동시에 호출. 단 한번만 호출되며 다시 호출할 수 없다.
(function () {
var a = 1;
var b = 2;
return a * b;
}());
(function () {
...
}());
(function () {
...
})();
!function(){
...
}();
+function(){
...
}();
var res = (function() {
var a = 1;
var b = 2;
return a * b;
}());
console.log(res) // 2
res = (function(a, b) {
return a * b;
}(3, 5));
console.log(res) // 15
function factorial(n) {
if(n <= 1) return 1;
return n * factorial(n-1);
}
factorial(5);
function outer() {
var x = 1;
function inner() {
var y = 2;
console.log(x + y);
}
inner();
}
outer();
function repeat(n, f) {
for(var i = 0; i < n; i++) {
f(i);
}
}
var logAll = function(i) {
console.log(i);
}
repeat(5, logAll);
var logOdds = function(i) {
if(i % 2) console.log(i);
};
repeat(5, logOdds);
repeat(5, function(i) {
if(i % 2) console.log(i);
});
콜백 함수로서 전달된 함수 리터럴은 고차 함수가 호출될 때마다 평가되어 함수 객체를 생성한다. 따라서 한번만 생성하게 만드는 것이 좋다.var logOdds = function(i) {
if(i % 2) console.log(i)
}
repeat(5, logOdds);
var count = 0;
// n이 값이 동일하다면 반환되는 값도 동일하다.
function increase(n) {
return ++n;
}
count = increase(count); // 재할당으로 상태 변경
console.log(count);
var count = 0;
function increase() {
return ++count;
}
increase();
console.log(count);
increase();
console.log(count);
💡 함수가 외부 상태를 변경하면 상태 변화를 추적하기 어려워진다. 따라서 함수 외부 상태의 변경을 지양하는 순수 함수를 사용하는 것이 좋다.