함수 표현식

Mia Lee·2021년 12월 1일
0

Java Script

목록 보기
16/25
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	/*
	함수 표현식
	- 자바스크립트에서 함수는 특수한 구조라기보다는 특수한 형태의 값으로 취급됨
	- 따라서, 값으로서 변수에 대입하거나 출력하는 등의 작업도 가능함
	*/

	// 함수 선언
	function func1() {
		alert("Hello, World!");
	}

	// 함수 호출
// 	func1();
// 	alert(func1); // func1 함수의 문장이 그대로 출력됨

	// 함수 표현식(함수의 이름 없이 선언문 만으로 함수를 정의하여 변수에 대입)
	var f = function() {
		alert("함수 표현식으로 선언된 함수");
	}

	// 함수 표현식으로 선언된 변수 f 값 출력
// 	alert(f); // 함수 코드가 출력됨
// 	f(); // 함수를 저장한 변수명을 함수 호출 문장 형식으로 사용 시 함수 실행 가능함
	// => 주의! 반드시 () 를 포함해야한다!

	// 기존에 선언된 함수를 복사하여 다른 변수에 저장도 가능
	var copyF = f;
// 	copyF(); // 복사된 함수를 실행(출력문이 실행됨)

	// 함수 표현식이 아닌 기본 함수 선언 방식으로 선언된 함수도 이름을 사용하여 복사 가능
	var copyF2 = func1; // func1() 함수 복사
// 	func1(); // 이 함수 호출 결과와
// 	copyF2(); // 이 함수 호출 결과는 같다!

	// =================================================================
	/*
	콜백 함수
	- 함수 내에서 어떤 조건에 따라 나중에 실행되는 함수
	- 자바스크립트에서는 보통 함수 파라미터에 다른 함수들을 전달한 뒤
	  특정 조건을 만족할 경우 전달받은 함수 중 하나를 호출하는 용도로 사용
	- 콜백 함수는 즉시 실행되지 않고, 전달된 함수 내에서 따로 호출됨
	*/
	function showOk() {
		alert("종료하겠습니다.");
	}

	function showCancel() {
		alert("종료를 취소하겠습니다.");
	}

	function selectMale() {
		alert("남성");
	}

	function selectFemale() {
		alert("여성");
	}

	// 함수 호출 시 파라미터로 함수를 전달하면 변수를 지정하여 해당 함수를 저장 가능
	// => 이 때, 파라미터로 전달받아 함수 내에서 별도로 호출되는 함수를 콜백함수라고 함
	function ask(question, yes, no) {
		// 함수를 yes, no 변수에 대입했으므로 함수 내에서 전달받은 함수 호출 가능함
		if(confirm(question)) { // Confirm 창에서 확인 버튼 클릭 시
			yes(); // yes() 함수 호출 시 showOk() 함수 내용과 동일한 코드가 실행
		} else { // Confirm 창에서 취소 버튼 클릭 시
			no(); // no() 함수 호출 시 showCancel() 함수 내용과 동일한 코드가 실행
		}
	}

	// ask 함수 호출
	// => 질문으로 매개변수에 "종료하시겠습니까?" 전달
// => 파라미터로 2개의 함수(showOk(), showCancel())도 함께 전달(호출이 아니므로 소괄호는 제외)
	ask("종료하시겠습니까?", showOk, showCancel);

	// 동일한 ask() 함수를 호출하여 전혀 다른 질문과 전혀 다른 작업을 실행 가능
	ask("여성입니까?", selectFemale, selectMale);

	// --------------------------------------
	// 함수 표현식을 활용한 콜백 함수 사용 예
	function ask2(question, yes, no) {
		if(confirm(question)) { // Confirm 창에서 확인 버튼 클릭 시
			yes();
		} else { // Confirm 창에서 취소 버튼 클릭 시
			no();
		}
	}

	// ask2() 함수를 호출할 때 파라미터에 전달할 값으로 함수를 직접 선언하여 전달도 가능
	ask2(
		"주문을 취소하시겠습니까?",
		function() { alert("주문을 취소하셨습니다."); }, // 두번째 파라미터(yes)에 전달되는 함수
		function() { alert("주문을 계속하겠습니다."); } // 세번째 파라미터(no)에 전달되는 함수
	);

</script>
</head>
<body>

</body>
</html>

0개의 댓글