개발 R.I.P.

5/16 Dev.Feedback(이중For문 Break, 문자열에 적용되는 산술 연산자, 함수 선언식, 표현식 Hoisting 차이)

편행 2021. 5. 16. 18:47
반응형

1. 이중 포문 내에서 Break을 쓰기 위한 조건은 상위 포문에서 만들어줘야 한다. 만일 변수를 선언해야 한다면, 전역 변수가 아닌 로컬 변수로 선언해야 한다.

function Prime(num) {
  let result = '2'

  for(let i=3; i<=num; i=i+2){
      let root = Math.sqrt(i);
      let prime = true; 
    for(let j=3;j<=root; j=j+2){
      if(i%j===0){
        prime = false;
        break
      }
    }
      if(prime){
    result = `${result}-${i}`
  }
  }

  return result;
}

전역 변수로 Prime을 선언하고 true로 할당하는 것은 의미가 없었다.
로컬 변수로 선언하는 이유는 
for문 내부에서 break의 조건을 만들어주기 위해서이기에 전역 변수로 선언하게 되면, break이 작동하지 않았던 것

2. 문자열에 적용되는 산술연산자는 '+' 뿐이다.

let str = '123';
console.log(str-'1')
위의 결과는 숫자열 122가 나온다.
console.log(str+'1')
위의 결과는 문자열 '1231'이 나온다.

https://github.com/denysdovhan/wtfjs

위의 링크에서 Javascript 내부에서 quirky한 부분들을 확인할 수 있다.

 

3. 함수 선언식은 코드를 구현한 위치와 관계없이 자바스크립트의 특징인 호이스팅에 따라 브라우저가 자바스크립트를 해석할 때 맨 위로 끌어 올려진다.

greet();

function greet() {
    console.log('Hi, there.');
}

이렇게 해도 오류가 나지 않는다.

 

3. 함수표현식은 함수선언문과 달리 선언과 호출 순서에 따라서 정상적으로 함수가 실행되지 않을 수 있다.

greet();

let greet = function() {
    console.log('Hi, there.');
}

이 이유는 호이스팅과 연관이 되어 있는데, 

호이스팅이란 함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것이다.

a = 5;
console.log(a);
let a; // 5

이렇게 코드를 작성을 하면, let은 호이스팅이 되지 않기에 밑의 결과값을 내놓는다.

Uncaught ReferenceError: Cannot access 'a' before initialization
let a;
a = 5;
console.log(a); // 5

즉 let로 변수를 선언해줄 때는 위의 경우처럼 꼭 우선적으로 선언을 해줘야 하는 것인데,

위의 함수 표현식을 살펴보면, greet이라는 함수가 선언되기 전에 호출이 된 것을 볼 수 있다.

그렇기에 오류가 나는 것이다.

반응형