작성
·
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. "일단 함수선언된 것부터 읽고 값을 순서대로 읽는지" 역시 어떤 의미인지 모르겠습니다.. ㅠㅠ
기본적으로 실행컨텍스트는 함수 실행 전에 모든 정보를 수집합니다 (호이스팅)
이후 맨 위에서부터 순서대로 한줄씩 실행합니다.
그러다 조건문을 만나면 해당 조건문 내부를 실행할 것이고,
반복문을 만나면 반복문 내부를 실행할 것이며,
함수 호출을 만나면 해당 함수를 실행할 것입니다.