2 minute read

Day16

Vanilla 사전 문제 해설

VanillaJS 사전 문제 해설

1.

  • 문제

1

  • 답 : 4번
  • 풀이

function안이 this는 window를 가리키게 되고 따라서 window.name과 window.age에 값이 저장된다. Cat함수는 반환값이 없기 때문에 tabby1에는 undefined가 저장된다. undefined의 name 멤버는 없기 때문에 오류가 발생한다.

1-해결

new 키워드를 통해 함수를 호출하면 this가 window가 아닌 해당 함수를 가리키게 된다. 따라서 위 코드가 정상적으로 실행되어서 ‘nana’가 출력된다.

1-예시

2.

  • 문제

2

  • 답 : 3번
  • 풀이

JS에서 변수나 함수를 선언하면 해당 변수나 함수는 그걸 감싸고 있는 function에 붙게 된다. 만약 감싸지 않고 그냥 선언하면 모두다 window 객체에 붙어서 전역변수화 되고 이는 추후에 문제가 될 수 있다.

2-예시

밖에서는 logCount에 접근할 수 없다. 하지만 logCount함수를 통해 logCount 변수가 얼마인지 알 수 있다.

3.

  • 문제

3

  • 답 : band undefiend roto play start
  • 풀이

this가 roto 객체를 가리키기 때문에 name은 undefined가 되고 memberName은 roto가 되서 위와 같이 출력된다.

3-예시1

thisTest.whoAmI() 멤버에서의 함수 안에서 this는 thisTest 객체를 가리키고 thisTest.testInTest.whoAmI() 멤버에서의 함수 안에서의 this는 testInTest 객체를 가리키게 된다.

3-예시2

코드를 위와 같이 바꾸면 idiots객체 내부의 name이므로 원래 의도한대로 출력된다.

4.

  • 문제

4

  • 답 : error가 발생한다.
  • 풀이

4-풀이

setTimeout에 인자로 전달된 함수 내에서 사용되는 this는 해당 함수를 가리키는데 해당 함수 내부에는 members 멤버가 없기 때문에 오류가발생한다.

해결 방법은 3가지가 존재한다.

4-해결1

arrow function 은 해당 function 자체로 scope를 만들지 않고 해당 arrow function 상위에 있는 스코프를 자신의 scope로 가진다. 따라서 this가 rockband의 this를 가리키게 됨.

4-해결2

bind함수는 해당 함수의 scope를 인자로 전달받은 객체의 scope로 변경해주는 함수이다. 위 코드와 같이 bind내부의 this는 RockBand를 가리키는데 해당 scope를 setTimeOut 내부의 익명 함수의 this로 변경해주기 때문에 정상적으로 실행된다.

4-해결3

closure는 해당 function 밖의 scope에 해당하는 변수를 참조하는 것을 말한다. 위 코드가 클로저를 이용하여 setTimeOut함수에 전달된 익명 함수의 this를 RockBand의 scope로 변경해주는 코드이다.

5.

  • 문제

5

  • 답 : setTimeOut에 의하여 실행되는 익명 함수가 참조하는 i는 이미 for 루프가 다 끝난 상태에서의 i이기 때문에 5가 된다. 따라서 배열에서 다섯 번째 원소는 없기 때문에 undefined가 출력된다.
  • 풀이

원래는 0은 바로 나오고 1은 1초 뒤, 2는 2초 뒤… 이런 식으로 나오도록 설계한 코드이지만 그렇게 동작하지 않는다.

이를 해결하는 방법에는 크게 3가지가 있다.

5-해결1

IIFE를 이용한 해결방법이다.

5-해결2

var는 function scope , let은 block scope

5-해결3

forEach 문 내부에 콜백 함수로 새로운 함수를 넘겨주기 때문에 해결1과 비슷한 해결 방법

6.

  • 문제, 답

6

  • 풀이

Hoisting : var로 선언된 변수는 실행 시 function scope 상의 가장 최상단으로 끌어올려진다.

6-풀이1

if문 내부의 선언된 변수들은 밖에선 사용하지 못하여야 하는데 var로 선언된 변수들은 최상위에 있는 function scope로 hoisting 되기 때문에 사용할 수 있게 된다.

6-풀이2

따라서 값이 할당되기도 전에 호출되는 버그를 만날 수도 있다.

let,const는 block scope라서 block을 벗어나면 더 이상 해당 변수를 사용하지 못하게 된다.

var와 let,const의 차이점

let, const 또한 hoisting이 일어나지만 Temporary Dead Zone이라는 개념 덕분에 할당되기 전에 호출하면 에러가 생긴다.

7.

  • 문제

7

  • 답 : 함수와 함수가 선언된 어휘적 환경의 조합이다.
  • 풀이

7-풀이1

7-풀이2

클로져를 이용하여 private 효과를 낼 수 있다.

Categories:

Updated: