자바스크립트에서 함수는 Object.prototype을 프로토타입으로 갖는 객체이며 프로그램에 의해 다뤄질(manupulated) 수 있는 값(value) 으로, 자바스크립트 코드에서 정의 되어 여러번 호출되거나 실행될 수 있다.
함수는 식별자(identifier)로 이루어진 리스트를 포함하는 형태로 정의 될 수 있는데 이를 매개변수(parameter)라고 하며 매개변수는 함수 안에서 지역변수처럼 작동한다. 이러한 함수를 호출하기 위해서는 매개변수로 들어가야할 인자(argument)를 포함하여야 하며 인자들은 값(value)이어야 한다.
자바스크립트 함수가 일급 객체라는 말은 함수를 값으로 쓸 수 있다. 따라서 함수는 변수에 할당될 수 있고, 객체의 속성으로도, 함수의 원소로 쓰이는 등 값의 역할을 수행 할 수 있다. 특히 함수가 객체의 속성으로 할당 된다면 우리는 그 함수를 method 라고 부른다. 심지어 함수가 배열에 할당된 경우에는 함수의 이름조차 필요하지 않는다.
let a = [x => x*x, 20]; // An array literal
a[0](a[1]) // => 400
함수는 당연하게도 자바스크립트의 원시자료형(primitive value)이 아니다. 이 뜻은 함수 또한 속성을 가질 수 있다는 말이다. 이 특성은 매우 유용하게 쓰일 수 있는데, 특정 함수 내에서만 쓰이는 변수 중에 함수가 기능을 마치더라도 기억되기를 원하는 경우가 있다. 가령 어떤 버튼의 클릭 횟수를 기록하고자 하는데 이를 함수 내 지역변수로 선언하게 되면 기능을 마쳤을 때 기록이 초기화되고, 전역 변수로 선언하기엔 실수를 유발할 수 있는 불편한 경우이다. 이 때 함수에 속성을 더해주면 편하게 처리할수 있다.
// It uses a property of itself to remember the next value to be returned.
function uniqueInteger() {
return uniqueInteger.counter++; // Return and increment counter property
}
uniqueInteger.counter = 0;
uniqueInteger() // => 0
uniqueInteger() // => 1