CODEDRAGON ㆍDevelopment/JavaScript, jQuery, ...
함수를 반환하는 함수와 클로저
- 함수값을 리턴하는 함수
- 함수를 리턴하는 함수 기능
- 익명함수를 반환하는 함수
- 클로저의 사용
- 클로저란
- 지역변수 규칙에 위배
- 학습 내용
- 소스 코드
- 출력결과
함수값을 리턴하는 함수
일반 값처럼 함수 값을 리턴할 수 있습니다.
함수를 리턴하는 함수 기능
- 함수를 호출함과 동시에 다른 함수로 바꾸기
- 자기 자신을 재정의하는 함수 구현
익명함수를 반환하는 함수
function outerFunction() { return function () { alert('Hello World .. !'); }; } outerFunction()(); |
클로저의 사용
함수 안에 있는 변수는 지역 변수이므로 외부에서 사용할 수 없습니다.
클로저를 사용하면 이 규칙을 위반하여 지역변수를 사용할 수 있도록 할 수 있습니다.
익명함수를 반환하는 함수에 지역변수가 있으면 익명함수는 클로저 함수로서 지역변수를 가져다 쓸 수 있습니다.
클로저란
- 지역 변수를 남겨두는 현상
- 함수 outerFunction()로 인해 생성된 공간
- 함수 outerFunction() 내부의 변수들이 살아있음
- 리턴되는 함수 자체
- 살아남은 지역 변수
function outerFunction(name) { var output = 'Hello ' + name + '.. !'; return function () { alert(output); }; } outerFunction('play')(); |
지역변수 규칙에 위배
f()종료 하여 결과값이 반환되었는데 f()에 있는 지역 변수 var n가 호출됨
클로저 현상(내부 함수 사용시 지역변수를 남겨두는 것
지역변수는 함수가 실행될 때 생성되고 함수가 종료될 때 사라지는데
내부함수를 만들고 내부함수를 감싸고 있는 함수의 지역변수를 내부함수에서 호출할 때 내부함수를 감싸고 있는 외부 함수가 종료되었지만 내부함수에서 지역변수를 호출할 수 있도록 지역변수를 남겨두는 현상)
학습 내용
- 내부 함수 정보 출력
- 내부 함수 실행 (호출후 반환값을 변수에 저장후 호출)
- 내부 함수 실행 (호출함수 실행한 후 바로 호출)
소스 코드
<html>
<head>
<meta charset="UTF-8">
<title>내부함수와 지역변수</title>
<script type="text/javascript">
function f(){
//지역 변수
var n = 100;
function g(){
document.write('n=' + n + '<br>');
document.write('g() is called');
}
//선언적 함수 반환 (내부 함수 정보 반환)
return g;
}
//f()를 실행시켜 내부함수를 반환받음
var result = f();
//내부 함수 정보 출력
document.write('내부 함수 정보 출력 ==========<br>');
document.write(result + '<br>');
document.write('<br>내부 함수 실행 (호출함수 반환값을 변수에 저장 후 호출)==========<br>');
/* 클로저: 내부 함수 사용시 지역변수를 남겨두는 것
지역변수는 함수가 실행될 때 생성되고 함수가 종료될 때 사라지는데
내부함수를 만들고 내부함수를 감싸고 있는 함수의 지역변수를 내부함수에서 호출할 때
내부함수를 감싸고 있는 외부 함수가 종료되었지만
내부함수에서 지역변수를 호출할 수 있도록 지역변수를 남겨두는 현상 */
//내부 함수 실행
result();
document.write('<br>');
document.write('<br>내부 함수 실행 (호출함수 실행한 후 바로 내부 함수 실행) ==========<br>');
//f()실행한 후 바로 g()함수(내부 함수)호출
//변수에 저장하지 않고 내부 함수 바로 출력
//f()실행한후 반환되는 내부함수 호출
f()();
</script>
</head>
<body>
</body>
</html>
출력결과
'Development > JavaScript, jQuery, ...' 카테고리의 다른 글
Warning-Undefined attribute name (ng-init) with eclipse (0) | 2022.03.14 |
---|---|
함수를 리턴하는 함수(자신을 재정의하는 함수 정의) (0) | 2022.03.09 |
함수 스코프 외부에서 내부 함수 호출 (0) | 2022.02.27 |
내부 함수 호출/함수 스코프 (0) | 2022.02.22 |
즉시 실행 함수 (1) | 2022.02.21 |