본문 바로가기
개발공부/JavaScript

[인사이드 자바스크립트] 교재 정리 #4 함수와 프로토타입 체이닝(1)

by dokii 2022. 5. 10.
728x90
반응형

자바스크립트에서 가장 중요한개념은 함수인데, 이에 대해서 알아보자.

4-1) 함수를 생성하는 방법 3가지

- 함수선언문

- 함수표현식

-funtion() 생성자 함수

 

4-2) 함수 리터럴

:함수명은 선택사항. 함수명이 없는경우 익명함수라한다.

funtion add(x,y) {
	return x+y;
 }

 

 

4-3) 함수 선언문 방식

: 리터럴형태와 같지만 함수명이 반드시 정의되어있어야함. 매개변수의 타입은 적지않아도 됨.

funtion add(x,y) {
	return x+y;
 }
 
 console.log(add3,4)); //출력값 7

4-4) 함수 표현식

: 자바스크립트에서는 함수도 하나의 값처럼 취급된다. 따라서 , 함수 리터럴로 하나의 함수를 만든뒤 변수에 할당하여 함수를 생성할수 있다.

: 함수이름은 보통사용하지 않는다.

: 아래에서 add변수는 함수 리터럴로 생성한 함수를 참조하는 변수이지, 함수이름이 아니다.

: 함수 변수 add는 참조값을 가지므로 plus에 그 값을 그대로 할당 할수 있다. 때문에 plus로도 호출해서 사용이가능하다.

: 즉 add와 plus는 같은 함수를 참조하는 함수 변수다.

var add = funtion (x,y) {
	return x+y;
 };
 
 var plus=add;
 
 console.log(add(3,4)); //출력값 7
 console.log(plus(5,6)); //출력값 11

 

4-5) 4-4에서 함수이름을 사용할수도 있다고 하였는데, 이름을 사용하면 기명 함수 표현식이된다.

: 기명 함수 표현식은 주의점이있다.

: 함수 표현식에서 사용된 함수이름이 외부코드에서 접근불가하다는 것이다.

: 사실 add()함수는 자바스크립트 엔진에 의해 add함수라는 구조로 변하기때문에 마치 add로 외부에서 사용할수 있는것처럼 보임

: 보통 기명함수 표현식을쓸때는, 재귀호출 처리를 하기위함이다.

var add = funtion sum(x,y) {
	return x+y;
 };
 
 console.log(add(3,4)); //출력값 7
 console.log(sum(5,6)); //Uncaught ReferenceError: sum is not defined

재귀호출 처리예제

var factiorialVar = funtion Factorial (n) {
	if(n<=1) {
    return 1;
    }
    return n * factorial(n-1);
 };
 
 console.log(factiorialVar(3)); //출력값 6
 console.log(Factorial(3)); //출력값 factorial is not defined

 

4-6) 자바스크립트는 세미콜론 사용을 강제하지는 않는다. 인터프리터가 자동으로 세미콜론을 삽입시켜주기 때문인데, 어떠한상황(ex.즉시실행함수)에서는 심각한 디버깅 상황을 초래하므로 함수표현식 방식에서의 세미콜론 사용을 강력하게 권고한다.

 

4-7) Function()생성자 함수를 통한 함수 생성하기

: 자바스크립트의 함수도 Function()이라는 기본 내장 생성자 함수로부터 생성된 객체다.

: 앞서 설명한 함수 선언문이나 함수 표현식 방식도 내부적으로 Function()생성자 함수로 함수가 생성된다고 볼수 있겠다.

: new Funtion (arg1,  arg2, ...argN, funtionBody) ; 

: arg -함수의 매개변수, funtionBody -함수호출될때 실행될 코드를 포함한 문자열

var add = new Funtion('x','y','return x+y');
console.log(add(3,4)); //출력값 7

 

4-8) 함수 호이스팅

: 함수가 선언되는 시점전에도 함수가 호출되는 경우가 있다. 즉 함수 선언문 형태로 정의한 함수유효범위는 코드의 맨처음부터 시작된다.

: 이것을 함수 호이스팅이라 함.

: 호이스팅이 발생하는 이유는 변수의 생성과 초기화 작업이 분리돼 일어나기때문. (->자세한건 나중에)

함수 생성 방식 호이스팅
함수 선언문 방식 일어남
함수 표현식 안일어남

 

4-9) 함수도 객체야

: 코드실행 뿐아니라 일반 객체처럼 프로퍼티들을 가질수있음

: property는 이름(string 이나 symbol)과 (원시함수(primitive), 메서드(method) 또는 객체 참조(object reference))을 가지고 있다. 보통 "프로퍼티가 object를 가지고 있다"라는 것은 "property가 object reference"를 가지고 있다는 것을 줄여서 말함

function add(x,y) {
	return x+y;
 }
 
 //add()함수 객체에 result,status프로퍼티 추가
 add.result =add(3,2);
 add.status = 'OK';
 
 console.log(add.result); //출력값 5
 console.log(add.status); //출력값 'OK'

 

4-10) 함수는 값으로 취급된다.

: 따라서 다음과 같은 동작이 가능

- 리터럴에의해 생성

- 변수나 배열의 요소, 객체의 프로퍼티등에 할당가능

- 함수의 인자로 전달가능

- 함수의 리턴값으로 리턴가능

- 동적으로 프로퍼티 생성,할당가능

//프로퍼티에 함수 할당
var obj ={};
obj.baz = funtion() {return 200;}
console.log(obj.baz()); //출력값 200

4-11) 함수 객체의 기본 프로퍼티

: ECMA5 명세서에는 모든함수가 length와 prototype프로퍼티를 기져야한다고 말한다.

: caller프로퍼티 - 자신이 호출한 함수를 나타냄, 함수가 정상적으로 실행될때 기대되는 인자의 개수

: arguments프로퍼티 - 함수호출시 전달된 인자값 나타냄

: prototype프로퍼티 - 이 함수가 생성자로 사용될때 생성된 객체의 부모역할을 하는 프로토타입 객체를 가리킴

: [[Prototype]]프로퍼티 - 자신의 부모역할을 하는 프로토타입객체 가리킴

: constructor프로퍼티 - 자신과 연결된 함수를 가리킴

 

4-12) 콜백함수

: 익명함수의 대표적인용도가 바로 콜백함수

: 어떤 이벤트가 발생하거나 특정시점에 도달했을때 시스템에서 호출되는 함수.

: 이벤트 핸들러에 사용하면, 웹 페이지가 로드되거나 키보드가 입력되는 등의 DOM이벤트가 발생할 경우, 브라우저는 정의된 dom이벤트에 해당하는 핸들러 실행시킴.

<!DOCTYPE html>
	<html><body>
    	<script>
        //페이지 로드시 호출될 콜백함수
        	window.onload = function() {
            	alert('start!');
            };
        </script>
     </body></html>

 

4-13) 즉시실행함수

: 정의함과 동시에 바로 실행하는 함수.

: 익명함수의 응용이다. 바로 결과가 출력됨.

: 최초 한번만 실행필요로하는 초기화 코드에서 쓴다.

(function (name) {
	console.log('start->' + name);
 })('foo');
 
 
 //출력 start->foo

 

4-14) 내부함수

: 함수내부에 다시 함수정의를 할수 있다.

: 내부함수에서는 자신을 둘러싼 외부함수의 변수에 접근이 가능하다.

: 함수 외부에서는 사용이 가능하지만, 가능하게 하기위해서는 부모함수에서 내부함수를 외부로 리턴하면된다. 이것을 클로저라고한다.

fuction parent() {
	var a =100;
    var b =200;
    
    //child()내부함수 정의
    funtion child() {
    	var b = 300;
    console.log(a); //100
    console.log(b); //300
    }
    child();
 }
 parent();
 child(); //child is not defined

 

4-15) 함수를 리턴하는 함수

: 함수를 호출함과 동시에 다른함수로 바꾸거나 자기자신을 재정의하는 함수를 구현할수 있다.

var self = funtion() {
	console.log('a');
    return function() {
    	console.log('b');
     }
 }
 
 self = self();//a
 self(); //b

 

 

 

728x90
반응형

댓글