"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 호이스팅 면접 질문 및 답변

호이스팅 면접 질문 및 답변

2024-11-02에 게시됨
검색:550

Interview Questions and Answers in Hoisting

1. 자바스크립트에서 호이스팅이란 무엇인가요?

답변: 호이스팅은 변수와 함수에 메모리가 할당되는 실행 컨텍스트 생성 단계의 프로세스입니다. 이 프로세스 동안 변수에 대한 메모리가 할당되고 변수에는 정의되지 않은 값이 할당됩니다. 함수의 경우 전체 함수 정의는 메모리의 특정 주소에 저장되고 이에 대한 참조는 해당 특정 실행 컨텍스트의 스택에 배치됩니다.

2. 변수 호이스팅과 함수 호이스팅의 차이점은 무엇인가요?

답변: 변수 호이스팅은 변수 선언이 해당 범위의 맨 위로 이동할 때 발생합니다. 반면, 함수 호이스팅은 본문을 포함한 전체 함수가 해당 범위의 맨 위로 이동할 때 발생합니다.

3. JavaScript에서 호이스팅은 어떻게 작동하나요?

답변: 호이스팅은 코드 실행이 시작되기 전에 변수 및 함수 선언이 해당 범위의 맨 위로 이동되는 JavaScript 메커니즘입니다. 호이스팅 덕분에 변수가 선언되기 전에 변수를 사용할 수 있습니다.

  • 변수 호이스팅: 변수가 선언되면 해당 범위의 맨 위로 이동되며 코드에서 선언되기 전에도 해당 변수를 사용할 수 있습니다.

  • 함수 호이스팅: 함수가 호이스팅되면 전체 함수 본문이 해당 범위의 맨 위로 이동됩니다. 이는 코드에서 선언되기 전에도 함수를 호출할 수 있음을 의미합니다.

4. 선언되었지만 초기화되지 않은 변수의 값은 무엇입니까?

답변: 변수를 선언했지만 값을 할당하지 않으면 변수에 값이 없는 것으로 간주됩니다. JavaScript는 호이스팅 중에 변수 선언을 맨 위로 이동하지만 변수에 아직 값이 할당되지 않았습니다. 변수가 정의되지 않은 상태로 할당되었습니다. 이는 변수가 아직 어떤 값도 수신하지 않았음을 의미합니다.

5. 동일한 범위에서 변수를 두 번 선언하면 어떻게 되나요?

답변: 동일한 범위에서 동일한 변수를 두 번 선언하면 두 번째 선언이 첫 번째 선언을 덮어쓰고 첫 번째 선언의 값이 두 번째 선언으로 대체됩니다. 이는 JavaScript가 첫 번째 선언을 메모리에 저장하고 두 번째 선언을 만나면 이전 값을 덮어쓰기 때문에 발생합니다.

6. var 키워드를 사용하지 않고 변수를 끌어올릴 수 있나요?

답변: 예, JavaScript에서는 var 대신 let 또는 const를 사용하여 변수를 끌어올릴 수 있습니다. 전통적으로 var를 사용해왔지만, 범위와 관련된 문제가 있기 때문에 let이나 const를 사용하는 것이 좋습니다.

let의 예:

let myVariable = 42;
console.log(myVariable); // Output: 42

const의 예:

const pi = 3.14159;
console.log(pi); // Output: 3.14159

let 및 const로 선언된 변수는 블록 수준 범위를 가집니다. 즉, 변수가 정의된 블록(예: 함수, 루프 또는 명령문)으로 제한됩니다. let은 재할당을 허용하는 반면 const는 상수에 사용되며 재할당할 수 없습니다.

7. 호이스팅 측면에서 함수 선언과 함수 표현식의 차이점은 무엇인가요?

답변: 함수 선언은 해당 범위의 맨 위로 끌어올려지는 반면, 함수 표현식은 그렇지 않습니다. 이는 함수 정의 이전에 함수 선언으로 선언된 함수를 호출할 수 있지만 함수 표현식으로는 동일한 작업을 수행할 수 없음을 의미합니다.

8. 호이스팅된 변수의 범위는 무엇입니까?

답변: 호이스팅된 변수의 범위는 변수가 선언된 위치에 따라 다릅니다. 변수가 함수 내에서 선언되면 해당 범위가 해당 함수로 제한됩니다. 즉, 변수 외부에서 액세스할 수 없습니다. 변수가 함수 외부에서 선언되면 전역 범위를 갖게 됩니다. 즉, 코드 어디에서나 액세스할 수 있습니다.

9. JavaScript에서 호이스팅을 어떻게 방지할 수 있나요?

답변: JavaScript에서는 호이스팅을 완전히 방지할 수는 없지만 이로 인해 발생하는 잠재적인 문제를 방지하는 방식으로 코드를 작성할 수 있습니다. 이를 수행하는 한 가지 방법은 모든 변수와 함수를 해당 범위의 최상위에 선언하는 것입니다.

위의 코드 예제에서 모든 변수와 함수는 var 또는 let을 사용하여 블록 상단에 선언됩니다. 이렇게 하면 변수와 함수가 해당 블록 내에서 끌어올려지고 해당 범위의 맨 위에 표시됩니다.

이 방법을 사용하면 코드 흐름과 변수 값을 더 쉽게 예측할 수 있으므로 가변성과 잠재적인 버그를 줄이는 데 도움이 됩니다.

10. JavaScript에서 호이스팅의 잠재적인 위험은 무엇입니까?

답변: 호이스팅은 작동 방식을 완전히 이해하지 못하면 잠재적인 문제로 이어질 수 있으며 결과적으로 예상치 못한 동작이 발생할 수 있습니다. 예를 들어 블록 문 내부에서 변수를 선언하고 블록 외부에서 해당 변수에 액세스하려고 하면 변수가 함수 또는 전역 범위의 맨 위로 끌어올려질 수 있으며 이는 의도한 것과 다를 수 있습니다.

  • 블록 범위 및 호이스팅: 블록 내부에 선언된 변수는 여전히 해당 범위의 맨 위로 끌어올려질 수 있습니다.

  • 디버깅 어려움: 호이스팅을 사용하면 액세스하려는 값이나 변수가 예상대로 작동하지 않을 수 있으므로 디버깅이 어려울 수 있습니다.

  • 함수 정의의 단점: 함수는 해당 범위의 맨 위로 끌어올려지지만 항상 예상한 방식으로 사용하지는 않을 수 있습니다.
    이러한 호이스팅 문제를 처리하려면 변수와 함수를 명확하게 선언하고 코드 내에서 호이스팅이 작동하는 방식을 이해하는 것이 중요합니다.

11. 호이스팅이 JavaScript의 실행 순서를 변경할 수 있나요?

답변: 예, JavaScript에서 호이스팅하면 코드 실행이 시작되기 전에 변수 및 함수 선언이 해당 범위의 맨 위로 이동됩니다. 이는 예상되는 코드 실행 흐름을 변경할 수 있습니다.
호이스팅을 사용하면 변수를 선언하고 실제로 정의되기 전에 사용할 수 있으며, 이로 인해 예상되는 코드 실행 순서가 변경되어 의도하지 않은 결과가 발생할 수 있습니다.
예를 들어, 스크립트 시작 부분에 함수를 정의하지 않고 나중에 사용하면 해당 함수가 맨 위로 끌어올려 코드에 예상치 못한 흐름과 동작이 발생할 가능성이 있습니다.

12. var 선언과 let 선언의 호이스팅의 차이점은 무엇입니까?

답변: var 선언은 범위의 맨 위로 끌어올려지는 반면, let 선언은 블록의 맨 위로 끌어올려집니다. 즉, let으로 선언된 변수는 해당 블록 외부에서 액세스할 수 없습니다.

이를 명확히 하기 위해 예를 살펴보겠습니다.

function example() {
    console.log(x); // undefined
    var x = 5;
    console.log(x); // 5
}
example();
console.log(x); // ReferenceError: x is not defined

여기서 var x = 5; 함수 범위의 맨 위로 끌어올려집니다. 하지만 선언 전에 console.log(x)를 호출하면 호이스팅으로 인해 값이 정의되지 않습니다.

이제 let을 사용한 예를 살펴보겠습니다.

function example() {
    console.log(y); // ReferenceError: y is not defined
    let y = 10;
    console.log(y); // 10
}
example();
console.log(y); // ReferenceError: y is not defined

여기서 y = 10; 블록 범위의 맨 위로 끌어올려졌지만 선언 전에 액세스하려고 하면 ReferenceError가 발생합니다.

요약하자면, var 변수는 함수 범위의 맨 위로 끌어올려지고, let 변수는 블록의 맨 위로 끌어올려집니다.

13. 호이스팅된 변수가 선언되기 전에 액세스하려고 하면 어떻게 됩니까?

답변: 호이스팅된 변수가 선언되기 전에 액세스하려고 하면 해당 값이 정의되지 않습니다.

14. JavaScript에서 화살표 함수의 호이스팅 동작은 무엇입니까?

답변: 화살표 함수는 JavaScript에서 호이스팅되지 않으므로 정의되기 전에는 화살표 함수를 호출할 수 없습니다.

// This will work
function regularFunction() {
    console.log("This is a regular function");
}
regularFunction(); // "This is a regular function"
// This will not work
arrowFunction(); // TypeError: arrowFunction is not a function
const arrowFunction = () => {
    console.log("This is an arrow function");
};

여기서 RegularFunction은 호이스팅되어 정의 전에 호출할 수 있지만, arrowFunction은 호이스팅되지 않으므로 정의 전에 호출하면 오류가 발생합니다.

15. 함수 내에서 호이스팅이 발생할 수 있나요?

답변: 예, 호이스팅은 함수 내에서 발생할 수 있습니다. 이는 함수 내부에 선언된 변수나 함수가 해당 함수 범위의 맨 위로 끌어올려진다는 것을 의미합니다.

16. JavaScript의 스코프 체인이란 무엇입니까?

답변: JavaScript에서 범위 체인은 JavaScript 엔진이 변수 값을 찾기 위해 사용하는 범위의 계층 구조입니다. 범위 체인에는 현재 함수의 범위, 외부 함수 범위 및 전역 범위가 포함됩니다.

스코프 체인은 변수 값을 찾기 위한 단계별 프로세스로 작동합니다. 변수나 함수가 함수 내부에 선언되면 JavaScript 엔진은 먼저 해당 함수의 범위 내에서 찾습니다. 거기에서 값을 찾지 못하면 외부 함수를 검색하여 전역 범위에 도달할 때까지 이 프로세스를 계속합니다.
이러한 방식으로 JavaScript는 범위 체인을 사용하여 변수 값을 찾고 변수가 정의된 위치에 따라 체인을 업데이트합니다.

17. 다음 코드 조각의 출력은 무엇입니까?

답변:

console.log(a);
var a = 10;
Output: undefined

18. 다음 코드 조각의 출력은 무엇입니까?

답변:
ReferenceError: a가 정의되지 않았습니다.
이 경우 a는 let을 사용하여 선언됩니다. 이는 해당 범위의 맨 위로 끌어올려지지 않음을 의미합니다. console.log() 문 이전에 a가 정의되지 않았으므로 참조 오류가 발생합니다.

19. 다음 코드 조각의 출력은 무엇입니까?

답변:

var a = 5;
(function() {
    console.log(a); // undefined
    var a = 10;
})();
Output: undefined

이 프로세스를 완전히 이해하기 위해 단계별로 분석해 보겠습니다.

첫 번째 줄에서 var a = 5; 전역 범위에서 값이 5인 변수 a를 생성합니다.
그런 다음 즉시 호출되는 함수 표현식(IIFE)이 정의되고 호출됩니다.
함수 내부에서 console.log(a); a의 값을 인쇄하려고 합니다. 그러나 var a = 10; 함수 내에서 선언되면 지역 변수 a가 함수 범위 밖으로 끌어올려지지만 해당 값은 아직 할당되지 않았으므로 undefound가 인쇄됩니다.
그 이후에는 var a = 10; 값이 10인 로컬 범위에 새 변수를 생성합니다.
따라서 첫 번째 console.log(a); 호이스팅으로 인해 undefound가 인쇄되고, 선언 후 a의 값이 10으로 업데이트됩니다.

20. 다음 코드 조각의 출력은 무엇입니까?

답변:

function test() {
  console.log(a);
  var a = 10;
  console.log(a);
}
test();
Output:
undefined
10

test() 함수는 두 개의 console.log() 문으로 정의됩니다.

첫 번째 console.log(a); 변수 a는 함수 내에서 선언되었지만 아직 값이 할당되지 않았으므로 undefound가 인쇄됩니다.
두 번째 console.log(a); 변수 a에는 값 10이 할당되며 이는 10으로 인쇄됩니다.
따라서 함수가 호출되면 첫 번째 console.log(a); 정의되지 않음을 인쇄하고 두 번째 console.log(a); 10을 인쇄합니다.

릴리스 선언문 이 기사는 https://dev.to/nozibul_islam_113b1d5334f/interview-questions-and-answers-in-hoisting-l0a?1 에서 복제되었습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3