• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

함수가 호출이 되면 그스코프 안에 어떤게 잇어도 일단 함수부터 읽고 나서 실행하는게 맞나요?

20.12.23 08:25 작성 조회수 303

0

무조건 호출 되면 그 호출된 함수실행하고 순서대로 이어 나가지는거 맞나요??;; 그리고 만약 for이나 if같은건 실행컨텍스트에서 제외가 되나요? 그냥 일단 함수선언된것 부터 읽고  값을 순서대로 읽어나가는게 맞나요?;

답변 3

·

답변을 작성해보세요.

0

무시하는게 아니에요. 함수 '호출'과 함수 '정의'를 구분하셔야 합니다.

1. init함수를 실행하면 init의 실행컨텍스트가 정보를 수집합니다. (호이스팅)
이 과정에서 변수 b와, 함수 poo의 존재를 인지하게 됩니다. 아직은 poo는 '실행'된 것이 아닌, '정의'가 되어있을 뿐입니다.

2. 이후 함수 내부의 첫줄부터 실행합니다. 첫줄에 poo함수를 호출하였으니 poo의 실행컨텍스트가 열립니다.
이 때 init 함수는 실행을 pause합니다. poo 함수 실행이 종료되면 다시 멈춘 위치에서부터 시작할 것입니다.

poo가 먼저 실행되는 것은 '같은 스코프의 변수나 출력을 무시하고'가 아니라, 정해진 규칙에 따라 순서대로 실행될 뿐입니다.
그 규칙이란, '어떤 함수가 실행되면 그보다 먼저 실행되고 있던 실행컨텍스트는 현재 위치에서 실행을 잠시 멈춘다'는 것입니다.
이렇게 중간에 멈추게끔 처리했기 때문에 프로그램이 원활하게 돌아가는 것입니다.

function outer() {
  function inner() {
    return 'inner';
  }
  const res = inner();
  console.log(res + ' outer');
}
outer();

이런 함수를 예로 들어볼까요?

만약 질문자님의 생각대로 '내부함수는 외부함수가 모두 실행된 다음에 실행된다'고 하면, 어떤 결과가 나올까요?
5번줄에서 inner함수를 호출했지만 실행되지 않은 채로 넘어갈 것이고,
res에는 undefined가 들어갈 것입니다.
그 결과 6번줄에서는 'undefined outer'가 출력되겠죠.
이는 본래의 의도와는 완전히 다릅니다. 순서에 입각한 '논리적인 프로그래밍'이 불가능해지는 것이죠.

----

곁다리로, '함수스코프'와 '블록스코프'는 구분이 필요합니다. 위 예제에는 '블록스코프'는 없고 오직 '함수스코프'만 있습니다.

0

김동님의 프로필

김동

질문자

2020.12.23

앗 감사합니다. 혹시 이렇게 코드가 있다고 치면요;;

 let a = '안녕?';

    function init(){

        poo()

        const b = '안녕하세요'

        function poo(){

        console.log(a);

        }

        

        console.log(b)

    }

 init();

console.log로 확인은 해보았지만 좀 막연해서 그런데요; 함수호출은 같은 스코프에 있는 변수나 출력을 무시하고 일단 호출한 함수부터 실행을 하고 그후에 같은 스코프 변수나 함수를 읽어 나가는건가요? 저 poo함수가 호출되면 바로 더안에 있는 내부함수를 먼저 실행하는게 좀 의아해서요 ㅠ 같은 블록스코프에 있는걸 다보고 보는줄 알았거든요 ㅠㅠ 그리고 답변 너무 감사합니다.

0

1. 함수를 호출하면 함수 내부의 내용이 순서대로 실행됩니다.
2. 내부에 반복문이 있다면 해당 반복문 내부가 조건에 맞게 실행됩니다.
3. for, if 등도 실행컨텍스트에서 제외되지 않습니다. 어떤 의미로 질문하신 건지 잘 이해가 안되네요..
4. "일단 함수선언된 것부터 읽고 값을 순서대로 읽는지" 역시 어떤 의미인지 모르겠습니다.. ㅠㅠ

기본적으로 실행컨텍스트는 함수 실행 전에 모든 정보를 수집합니다 (호이스팅)
이후 맨 위에서부터 순서대로 한줄씩 실행합니다.
그러다 조건문을 만나면 해당 조건문 내부를 실행할 것이고,
반복문을 만나면 반복문 내부를 실행할 것이며,
함수 호출을 만나면 해당 함수를 실행할 것입니다.