| 함수 정의 방식 | 예시 |
|---|---|
| 함수 선언문 (일반 함수) | function add(x,y) { return x+y; } |
| 함수 표현식 (익명 함수) | var add = function (x,y) { return x+y; }; |
| Function 생성자 함수 | var add = new function('x','y', 'return x+y;'); |
| 화살표 함수 | var add = (x,y)=> x+y; |
// SyntaxError: Function statements require a function name
function (x,y) {
return x + y;
}
// 함수 선언문
function add1(x,y) {
return x + y;
} // 코드블록이므로 ";"는 붙이지 않는다
console.log(add1(1, 2)); // 3
// 함수 표현식
var add2 = function(x,y) {
return x + y;
}; // 리터럴이므로 ";" 를 붙여주는게 맞다
console.log(add2(1, 2)); // 3
// 함수 선언문? 표현식?
var add3 = function add4(x,y) {
return x + y;
} // ";" 없다고 오류가 나지는 않는다
console.log(add3(1, 2)); // 3
console.log(add4(1, 2)); // ReferenceError: add4 is not defined, add4 선언이 무시됐다
함수 선언문으로 정의한 함수는 선언한 위치보다 위에서 호출할 수 있다
// 함수 호출
console.dir(add); // f add(x,y)
console.dir(sub); // sub 변수는 변수 호이스팅에 의해 생성이 된 상태
// 함수 호출
console.log(add(2,5)); // 7
console.log(sub(2,5)); // TypeError: sub is not a function
// 함수 선언문(일반 함수)
function add(x,y) {
return x + y;
}
// 함수 표현식(익명 함수)
var sub = function (x, y) {
return x - y;
}
var add = new Function('x','y', 'return x + y;');
console.log(add(1,2)); // 3
// 책의 예시 코드는 오류가 있다
var add2 = (function () {
var a = 10;
return new Function('x','y', 'return x + y + ' + a + ';'); // 문자열에 a를 삽입한다는 것에 유의
}());
console.log(add2(1,2)); // 13
1) 생성자 함수로 사용할 수 없다
2) this 바인딩 방식이 다르다
3) prototype 프로퍼티가 없다
4) arguments 객체를 생성하지 않는다
function add(a = 4,b = 5,c = 6) {
return a + b + c;
}
console.log(add(3,2,1)); // 6
console.log(add(3,2)); // 11
console.log(add(3)); // 14
console.log(add()); // 15
console.log(add(3, c = 1)); // 10, 이런 문법은 지원하지 않고, 인자 순서만 본다
console.log(add('1','2','3')); // '123', 인자에 타입이 정해져 있지 않다
function changeVal(primitive, obj) {
primitive += 100;
obj.name = 'Kim';
}
var primVal = 100;
var objVal = { name : 'Lee' };
console.log(primVal); // 100
console.log(objVal.name); // Lee
changeVal(primVal, objVal);
// 원시 값은 불변
console.log(primVal); // 100
//객체는 mutable
console.log(objVal.name); // Kim
console.log('start!');
var addVal = (function add(a, b) { // 기명함수로 정의는 가능
console.log('function!'); // 함수 호이스팅이 일어나지는 않음
return a + b;
} (1,2));
console.log(addVal);
console.log(add); // add is not defined, 재호출 불가능
/**
start!
function!
3
Error : add is not defined
*/
function outer() {
var x = 1;
function inner() {
var y = 2;
console.log(x + y); // 바깥 스코프의 변수 x 참조 가능
}
inner();
}
outer(); // 3
inner(); // inner is not defined
console.log(add(1,2)); // add is not a function
var a = true;
if(a) {
function add(x,y) {
return x + y;
}
}
function repeat(n, callback) {
for (var i = 0; i < n; i++) {
callback(i);
}
}
var callback = function(i) {
console.log(i);
}
// 함수 참조를 전달한다. callback()를 전달하면 안된다.
repeat(5, callback); // 0 1 2 3 4
// 익명 함수 리터럴도 전달 가능하다
repeat(5, function (i) {
if (i % 2) console.log(i);
}); // 1 3
순수 함수 : 부수효과가 없는 함수
순수 함수는,
1. 하나 이상의 인자를 갖는다.
2. 동일한 인자가 전달되면 언제나 동일한 값을 반환하는 것을 보장한다
3. 인자를 변경하지 않는다
4. 외부 상태를 변경하지 않는다
var count = 0;
function increase(n) {
return ++n;
}
increase(count);
console.log(count); // 0, count 는 그대로
count = increase(count); // 변수에 재할당
console.log(count); // 1
비순수 함수 : 부수효과가 있는 함수
var count = 0;
function increase() {
return ++count;
}
increase();
console.log(count); // 1, count가 변경됐다
console.log(increase()); // 2, 인자도 없는데 return이 달라졌다
외부 값은 인자를 통해서 받고, 스코프는 가능한 사용하지 말 것
인자는 불변인 것이 좋다
의문점