[JavaScript] JS 함수로 코드 줄이기, 실수 줄이기, 그리고 동적 언어로서의 객체 다루기.

yoon·2023년 2월 24일

함수를 이용해 반복적인 코드 줄이기

function attack(mode){
  let attackValue ;
  if(mode === 'ATTACK'){
    attackValue = PLAYER_ATTACK_VALUE
  }else if(mode === 'STRONG'){
    attackValue = PLAYER_STRONG_ATTACK_VALUE
  }
  currenrMonsterLife -= dealMonsterDamage(attackValue);
  judgment()
}

function attackHandler(){
  attack('ATTACK')
}

function strongAttackHandler(){
  attack('STRONG')
}

함수를 이용해 다음과 같이 반복적인 코드를 줄일 수 있다. attackHandlerstringAttackHandler 의 차이점은 함수에 이용되는 문자열 하나뿐이기 때문에, 해당 문자열을 인자로 받는 또 다른 함수를 매개변수로 하는 코드를 저장하고, attackHandlerstringAttackHandler에서 인자를 전달하도록 하는 것이다.

식별자는 상수로 선언

위의 코드에서 'ATTACK'과 'STRONG' 이 반복적으로 등장한다. 이 둘은 attack 함수에서 조건문의 조건식에 들어가 식별자로서의 역할을 한다. 즉 attackHandler가 실행된건지 stringAttackHandler가 실행된건지 구분해주고 식별해준다, 즉 식별자이다. 이러한 경우 만약에 오타가 발생할 시 변수로 선언된 것이 아니라서 붉은 줄이 뜨질 않아 오류를 찾기 힘들어지기 때문에 상수로 선언해주는 것이 좋다.

객체에서 정의되지 않는 속성을 접근할 수 있다?

function logging(ev, val, currentPlayerLife, currentMonsterLife) {
  let logEntry = {
    event: ev,
    value: val,
    playerHealth: currentPlayerLife,
    monsterHealth: currentMonsterLife,
  };
  if (ev === MODE_ATTACK || ev === MODE_STRONG_ATTACK) {
    //logEntry에서 존재하지 않는 속성도 이렇게 지정 가능함. 이러면 자동으로 속성이 추가됨.
    logEntry.target = "MONSTER";
  } else if (ev === MODE_MONSTER_ATTACK) {
    logEntry.target = "PLAYER";
  }
  gameLog.push(logEntry);
}

위 코드는 유효한 코드이다. logEntry에서 target이라는 속성이 부재함에도 불구하고 조건문에서 점 표기법을 통해 접근하고 있다. 그 이유는 자바스크립트에서는 객체의 속성을 동적으로 추가할 수 있기 때문인데, 존재하지 않는 속성에 값을 할당하면 해당 속성이 자동으로 생성된다.

이것이 JavaScript의 동적 언어로서의 독특한 특징이다.

0개의 댓글