: 일련의 과정을 문으로 구현하고 코드 블록으로 감싸서 하나의 실행 단위로 정의 한것
함수를 사용하는 이유는?
변수는 '선언', 함수는 '정의'로 표현한다
함수선언문은 표현식(값을 반환하는 식/코드)이 아닌 문(프로그래밍을 실행하는 최소단위)
function sum(x, y){
return x+y;
}
var sum = function sum(x, y){ // 의사코드
return x+y;
}
함수 이름을 생략할 수 없다
함수 선언문은 변수에 할당할 수 없다
var sayHi = function sayHi(){
return 'hi';
}
function sayHi
를 함수 선언문이 아닌 함수 리터럴 표현식으로 해석했기 때문함수 선언문을 피연산자로 사용하면 함수 리터럴 표현식으로 해석됨
(function sayHi(){ console.log('hi'); }); // 함수 리터럴 표현식(이름 생략 가능)
sayHi(); // sayHi is no defined
함수리터럴로 생성한 함수 객체를 변수에 할당하는 정의방식
var sum = function (x, y){
return x+y;
}
호이스팅(함수 선언문 vs 함수 표현식)
호이스팅이란 : js 엔진이 코드가 실행하기 전 변수선언/함수선언이 해당 스코프의 최상단으로 끌어 올려진 것처럼 보이는 현상
undefined
로 초기화undefined
로 초기화 / 런타임 때 함수 객체가 됨)객체를 생성하는 함수
var sum = new Function('age', 'height', 'return age + height')
const sum = (age, height) => age + height;
화살표 함수의 한계
인수는 반드시 표현식이어야함
매개변수가 undefined
로 초기화 된 후 인수가 순서대로 할당 된다
매개변수 > 인수 개수
=> 할당되지 않은 매개변수 값은 undefined로 할당됨
매개변수 < 인수 개수
=> 초과된 인수는 암묵적으로 arguments 객체의 프로퍼티로 보관
function add(a, b){
return a + b;
}
add(1);
add(1, 2, 3);
인수가 전달되지 않은 경우 단축평가 혹은 default값으로 기본값 부여
function test(a, b = 0){
a = a || 0; // a값이 없으면 0할당
}
이상적인 함수는 한 가지 일만 해야 하며 가급적 작게 만들어야 한다. 172p
function change(num, obj) {
num += 1;
obj.age = 10
}
var age = 12;
var student = { age : 12 }
change(age, student);
console.log(age, student); // 12, 10 -> 객체는 원본 훼손
원시값
->값에 의한 전달이 되어 원본 값이 변경되지 않음참조값
-> 참조에 의한 전달이 되어 원본이 변경됨4-1. 즉시 실행 함수
(function() {
alert('hi');
}());
4-2. 재귀 함수
재귀 호출(자기 자신을 호출하는 행위)을 수행하는 함수
var factorial = function a(n){
if (n <= 1) return 1;
return n * factorial(n - 1);
};
factorial(5);
4-3. 콜백 함수
함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수
function repeat(n, f){ // f는 고차 함수
for(var i=0; i<n; i++){
f(i)
}
}
var logOdds = function(i) {
if (i % 2 ) console.log(i);
};
repeat(5, logOdds); // logOdds는 콜백함수
배열 고차 함수에서도 사용
var res = [1,2].map(function (item) { return item*2;});
4-4. 순수 함수 vs 비순수 함수
var count = 0;
function pureFunc(n){ // 순수 함수
return ++n;
}
function impureFunc(){ // 비순수 함수
return ++count;
}
count = pureFunc(count);
impureFunc();