티스토리 뷰
함수 선언문
function funcName(x, y) { return x + y; }
내부적으로 함수 표현식으로 변환됨
let funcName = function funcName(x,y) { return x + y; };
함수 표현식
함수 리터럴로 만든 함수를 변수에 할당하여 함수를 생성하는 것
let funcName = function (x,y) { return x + y; };
이름을 안 붙일수도 있고 (익명 함수 표현식), 이름을 붙일 수도 있음 (기명 함수 표현식).
단, 이름을 붙여도 함수 내부에서 재귀적으로 호출하거나 디버거에서 구분을 위해 사용하는 것만 가능하고, 외부에서 해당 이름으로 호출할 수 없음.
Function() 생성자
new Function(arg1, arg2, ... , argN, functionBody);
var add = new Function('x', 'y', 'return x + y');
자주 사용되지 않음
함수 선언문의 경우 함수 호이스팅()이 발생해서 코드 구조를 엉성하게 만들 수 있으므로 함수 표현식만을 사용할 것을 권장
함수도 객체다
일반 객체처럼 프로퍼티 추가 가능
함수를 선언문 방식으로 함수를 생성할 때 함수 코드는 함수 객체의 [[Code]] 내부 프로퍼티에 자동으로 저장된다. (ECMAScript 명세)
'일급 객체' (값처럼 취급됨 - 변수,배열,프로퍼티에 할당 가능, 함수 인자로 전달 가능, 리턴값으로 리턴 가능)
함수 객체의 기본 프로퍼티
ECMA5 명세
length: 함수가 정상적으로 실행될 때 기대되는 인자의 개수 (함수를 작성할 때 정의한 인자 개수)
prototype: != __proto__, 이 함수가 생성자로 사용될 때 이 함수를 통해 생성된 객체의 부모 역할을 하는 프로토타입 객체 (해당 프로토타입 객체는 constructor 프로퍼티로 다시 이 함수를 가리키고 있음)
비표준
name: 함수의 이름 (익명이면 빈 문자열)
caller: 자신을 호출한 함수 (호출되지 않았으면 null)
arguments: 함수를 호출할 때 전달된 인자값 (호출되지 않았으면 null) (cf: ECMA 표준: arguments 객체)
__proto__: 내부 프로퍼티 [[Prototype]]의 구현, Function.prototype 객체 (Empty()함수, 함수이지만 예외적으로 부모는 Function.prototype이 아닌 Object.prototype)
Function.prototype 객체
프로퍼티: constructor, 메서드: toString(), apply(thisArg, argArray), call(thisArg, [, arg1 [, arg2, ]]) 메서드, bind(thisArg, [, arg1 [,arg2,]]) 메서드
콜백 함수: 함수를 등록만 해놓고 이벤트 핸들러 등에 의해 실행
즉시 실행 함수: 함수의 정의와 동시에 실행( (function (arg1) { ... })(val1); ) 초기화 코드에 많이 사용
내부 함수: 함수 내부에 정의. 함수 내부에서는 접근 가능하나 함수 외부에서는 접근 불가능 (접근하려면 외부함수에서 리턴해줘야) 내부 함수에서는 외부 함수 접근 가능 (클로저 개념 확인)
argument 객체
함수 호출 시 인자를 정의보다 적게 넘긴 경우: 앞에서부터 할당되고 나머지는 undefined
많이 넘긴 경우: 초과된 인수는 무시
함수 호출 시 인수들과 함께 암묵적으로 argument 객체가 함수 내부로 전달됨
argument 객체: 함수 호출 시 넘긴 인자들이 배열 형태로 저장된 객체 (유사 배열 객체 - 배열 메서드 사용 불가, 사용하려면 call/apply 메서드 이용한 this 바인딩 필요)
프로퍼티: 함수 호출 때 넘겨진 인자 (배열 형태), length, callee (현재 실행 중인 함수의 참조값)
'프로그래밍언어공부 > javascript' 카테고리의 다른 글
[인사이드 자바스크립트] 5일차 (0) | 2020.08.29 |
---|---|
[인사이드 자바스크립트] 4일차 (0) | 2020.08.28 |
[인사이드 자바스크립트] 1일차 (0) | 2020.08.21 |