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')
}
함수를 이용해 다음과 같이 반복적인 코드를 줄일 수 있다. attackHandler와 stringAttackHandler 의 차이점은 함수에 이용되는 문자열 하나뿐이기 때문에, 해당 문자열을 인자로 받는 또 다른 함수를 매개변수로 하는 코드를 저장하고, attackHandler와 stringAttackHandler에서 인자를 전달하도록 하는 것이다.
위의 코드에서 '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의
동적언어로서의 독특한 특징이다.