강아지와 고양이
149
2022-08-06 00:31:05
6
217

자바스크립트에서 const


자바스크립트를 접한지 며칠 안됐는데요.

자바 스크립트에서는 for/while 반복문 내에서 

while(true){

const num = prompt("fdsa");

}

이런 식으로 해도 아무런 문제가 안되나요..?

const는 상수인데 계속 바꾸는 점이랑

initialization을 계속 반복하는 게 이해가 안됩니다. 

강의에서 저렇게 여러번 사용해서 질문드립니다.

0
  • 답변 6

  • S_J
    781
    2022-08-06 00:39:40

    질문자님은 아래처럼 사용해도 문제가 안되냐고 하셨는데

    while(true) {
      const num = prompt("fdsa");
    }


    강의에서는 어떻게 사용하고 있나요?

  • 연근
    63
    2022-08-06 00:40:18 작성 2022-08-06 00:45:48 수정됨

    1. const는 상수인데 계속 바꾸는 점

    중괄호 내에서만 살아있는 거라 한 번 돌때마다 새로 선언됩니다


    {
      const hi = "hello";
    }
    console.log(hi); // hi is not defined


    2. initialization을 계속 반복하는 게 이해가 안됩니다. 

    괄호 밖에서 필요없어서 그렇습니다


  • 강아지와 고양이
    149
    2022-08-06 00:45:19
    let input = prompt("what would you like  to do?");
    const todos = ['Listen to music', 'Meet friends'];
    let newTodo;
    let index;
    let deleted;
    while (input !='quit' && input != 'q'){
        if(input === 'list')
        {
            console.log('*********************');
            for(let i = 0; i<todos.length; i++){
                console.log(`${i}: ${todos[i]}`)
            }
            console.log('*********************');
        } else if (input === 'new')
        {
            newTodo = prompt('Ok, what is the new todo?');
            todos.push(newTodo);
            console.log(`${newTodo} added to the list!`);
        } else if (input === 'delete')
        {
            index = parseInt(prompt('Ok, enter an index to delete:'));
            console.log(todos.length);
            console.log(index);
            if(!Number.isNaN(index) && index<todos.length){
            deleted = todos.splice(index, 1);
            console.log(`Ok, deleted ${deleted[0]}`);
            } else {
                console.log('Unknown index');
            }
        }
        input = prompt("what would you like  to do?");
    }
    console.log("OK QUIT THE APP!!");


    #S_J 

    강의에서는 

    let newTodo;

    let index;
    let deleted;
    를 loop 안에 const 선언해서 사용하고 있습니다.

    위 코드는 제가 바꾼 거고요.


  • S_J
    781
    2022-08-06 00:55:33

    반복문 안에서만 사용하는 변수는 반복문 안에서만 선언하는게 맞습니다.


    강의 소스랑 비교하면 질문자님 코드가 더 좋은 코드 입니다.

  • 강아지와 고양이
    149
    2022-08-06 13:31:26

    #S_J 

    검정 배경의 코드는 제가 수정한 코드입니다.

    저렇게 쓰지 말고, while 안에 const 선언해서 쓰는 게 낫다는 거죠..?


  • 연근
    63
    2022-08-07 12:49:07 작성 2022-08-08 14:37:10 수정됨

    1. 할당된 메모리가 필요없으면 해제 되어야 합니다.

    가장 상위에 선언된 변수는 메모리를 계속 차지하고 있습니다. (js의 GC가 사용하지 않는다 판단하면 해제를 해주겠지만 GC에 너무 의존하는건 좋지 않습니다.)
    https://developer.mozilla.org/ko/docs/Web/JavaScript/Memory_Management#garbage_collection


    2. 코드의 의도가 적절해야합니다.

    작성자님이 변경하신 코드는 변수명(ex: newTodo)만으로 값을 추측해야하고 변경점을 추적해야합니다. (let이니까)

    -> 이는 디버깅을 어렵게하고 할당된 값을 신뢰하기 어렵게 만듭니다. (값이 변경될 수 있기 때문에)

    그럼에도 let이 존재한다는 건 한 번 이상 값이 변경된다는 의미로 사용됩니다.


    그리고 변수를 가장 적절한 scope에 위치 시켜야 이 변수가 영향을 주는 범위를 정확하게 알 수 있습니다.

    -> 가능한한 안쪽 scope에 배치시켜야합니다.


    => const를 우선으로 사용하고 안쪽 scope에서 변수 선언

  • 로그인을 하시면 답변을 등록할 수 있습니다.