인프런 커뮤니티 질문&답변

김동님의 프로필 이미지
김동

작성한 질문수

코어 자바스크립트

(예전자료 - 삭제) 함수스코프, 실행컨텍스트

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

작성

·

497

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

김동님의 프로필 이미지
김동
질문자

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

 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. "일단 함수선언된 것부터 읽고 값을 순서대로 읽는지" 역시 어떤 의미인지 모르겠습니다.. ㅠㅠ

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

김동님의 프로필 이미지
김동

작성한 질문수

질문하기