본문 바로가기
갬발자의 프로그래밍/Javascript

function

by 코라제이 2019. 12. 20.

function 오브젝트의 저장 형태는 {  key : value } 형태로 저장된다.

 

function foo(){} // {foo : {..}} 의 형태로 저장

 

위와 같이 인식을 하기 때문에 js에서는 오버 로딩이 이 없다

 

함수가  실행될 환경을 알아야 맞춰서 실행할 수 있기에 함수 실행 환경 인식이 필요하다

 

function 키워드를 만나 object를 만나는 시점이 실행 환경 설정 시점이다.

여기서 실행 영역을 설정하게 된다. (단 한 번만 스코프만 만들면 된다.)

 

함수 코드의 해석 순서.

함수 안에 함수 선언문을 해석한다.

변수를 초기화한다.

코드를 실행한다.

 

함수 정의 형태

 

함수 표현식 

var foo = function(){}

 

함수 선언식

function foo(){}

 

함수를 해석할 때 변수를 초기화했고 그다음 실행하기 때문에  js가 foo()를 실행할 때 first를 해석했지만 그 값을 알 수 없다는 것을 알 수 있다.  

function foo(){
    console.log(first); //디버그 해보면 first의 값은 undefined
    var first = 1;
}
foo();

undefined는 js에서 만은 변수를 만드는 존재이다.

그렇기 때문에 이것을 방지하기 위해 es6에서  let과 const가 사용되고 권장되는 것이다.

function foo(){
    console.log(first); //Cannot access 'first' before initialization
    let first = 1; 
}

foo();

 

함수는 참조에 의한 호출과 값에 의한 호출이 있다.

//값에 의한 호출

let foo = 1;

function a(x){
    return x = x+1
}

console.log(a(foo), foo);// 2, 1

위 코드를 실행시키면 a(x)에서 foo의 복사본이 인자 x에 할당된다. 이때 foo와 x는 다른 영역의 메모리에 위치하게 된다.

그래서 x값을 바꾸더라도 foo의 값은 변하지 않는다. 이것을 값에 의한 호출이라 한다.

 

//참조에 의한 호출
let foo = {x: 1, y: 2};

function a(q){
    q.x = q.x+1;
    q.y = q.y+1;
    return q; 
}

console.log(a(foo),foo); // {x: 2, y: 3}, {x: 2, y: 3}

위 코드를 실행시키면 a(foo)를 통해 foo에 복사본이 인자 q에 할당된다. 이부분까지는 값의 전달과 같다. 하지만 foo에 객체가 참조 하는 형태가 되어있으며 이 참조값(객체)을 인자q에 전달하게 된다. 결국 foo와 q는 똑같은 객체를 참조하기에 같은 결과가 나오게 된다.

'갬발자의 프로그래밍 > Javascript' 카테고리의 다른 글

prototype  (0) 2019.12.23
Execution Context  (0) 2019.12.23
Argument 처리 형태  (0) 2019.12.22
호이스팅  (0) 2019.12.20
스코프 결정 시점 과 함수레벨스코프  (0) 2019.12.20

댓글