본문 바로가기

JAVASCRIPT

[자바스크립트] 함수 호출

1) 함수로 호출 : return 

괄호 안에 있는 각 인자 표현식을 호출 시점에서 평가한 값이 인자

일반적 함수 호출에는 함수에서 반환 값이 호출 표현식의 값

return문을 만나지 않은 채 인터프리터가 함수의 끝에 도달하면 반환 값은 undefined

 

2) 메서드 호출 

객체 프로퍼티로 저장된 자바스크립트 함수 

// 대괄호 표현식 
a[0](z) // a[0]이 함수라면 메서드 호출 


// 메서드 호출 표현식
lat calculator = {
	operand1 :1,
    operand2 : 1,
    add() {
    	// 메서드 단축 문법을 사용
    	this.result = this.operand2;
        // this 키워드를 포함하는 객체를 참조함 
        }
   };
   
   
// this키워드 : 메서드로 사용되는 함수는 모두 자신을 호출하는객체를 암묵적인 인자로 받음

* 메서드 체인 

메서드가 객체를 반환하면 반환 값에서 다시 메서드 호출 가능, 메서드 호출을 '체인'으로 이어 표현식 하나로 받음 

객체를 한번만 참조해도 연속으로 메소드 호출 가능 

new Heart().x(100).y(100).size(50).outline("red").fill("blue").draw();

 

* 주의사항

중첩 함수 f()에서 this키워드는 객체 o와 같지 않음  -> 자바스크립트 언어 결함

화살표 함수로 변환 or  this값을 self에 저장해서 사용해 this 값을 상속하게 하는 것도 가능함 

let o ={ //객체o
	m: function() { // 객체의 메서드 m
    let self =this; // this 값을 변수에 저장 
    this === o // true => this는 객체o
    f(); // 보조 함수 f() 호출
    
    function f() {
    	this === o
        self() === o
        }
    }
 };
        self === o
        }
     }
  };

 

3) 생성자로 호출 

함수나 메서드를 호출할 때 new를 붙여 생성자로 호출함 > o = new Object(); 

생성자를 호출하면 생성자의 프로토타입프로퍼티에서 지정된 객체를 상속하는 빈 객체를 생성

생성자 함수는 객체를 초기화할 의도로 만들어짐, 이렇게 새로 생성된 객체가 호출 컨텍스트로 사용

 

4) 간접적 호출 

메서드를 사용해 간접 호출이 가능 

call()과 apply()라는 함수를 간접적으로 호출해, 두 메서드 모두 호출 시점에 this 값을 직접 명시할 수 있음 

* call(a, b) 인자 리스트를 받음

* apply() 인자로 배열을 받음 


* strict 모드

함수의 맨 처음에 "use strict" 지시어를 사용해 엄격한 오류 검사를 적용

문법과 런타임 동작을 모두 검사해 실수를 에러로 변환함 

변수 사용을 단순화시킴 (변수 이름의 매핑을 단순화함, 대부분의 컴파일러의 최적화는 변수 매핑에 있음)

"use strict" 
// 전체 스크립트 모드를 strict 모드로 설정 
// 전역에 적용한 strict mode는 스크립트 단위로 적용

try{
	num =3.14;
}catch(ex){
	document.getElemnetByld("text").innerHTML = ex.name + "<br>";
    } 
    //reference is error
    
    
// 함수에서 strict 선언 
function oo(){
	"use strict"; // 코드 제일 앞에 위치시켜야 동작함
	x:10;
    }
oo();

* use stirct 사용으로 발생하는 제약 조건 

 1) 전역 변수를 허용하지 않고, 전역 변수 선언 시 오류 발생 

2) 변수 이름 선언 + 사용 시, var 누락되면 오류 발생 

3) 값 할당 실패는 오류 발생 

4) 삭제할 수 없는 속성을 삭제하려고 하면 오류 발생 

5) 읽기 전용 속성에 쓰기를 하려고 하면 오류 발생 

6) 객체 리터럴의 모든 속성의 이름은 고유해야 함 

7) 함수의 파라미터는 고유해야 함 

8) with키워드 금지, eval, agruments 예약어 사용 불가능

 

728x90