(Scope Pollution이 가득한 코드)
// The scope of `random` is too loose
// 문제 ① 'random' 변수의 범위가 너무 느슨하다. random을 전역변수로 설정하는 것보다는,
// 사용하는 함수에 지역변수로 넣는 것이 더 좋을 것 같다.
const random = Math.floor(Math.random() * 3);
const getRandEvent = () => {
if (random === 0) {
return 'Marathon';
} else if (random === 1) {
return 'Triathlon';
} else if (random === 2) {
return 'Pentathlon';
}
};
// The scope of `days` is too tight
// 문제 ② 'days' 변수의 범위가 너무 묶여있다. if 문 안에 days 변수를 여러개 쓰고,
// getTrainingDays () 함수의 블록문안에 days 변수를 사용하는 것은 오류 발생이 될 것으로 보임.
const getTrainingDays = event => {
if (event === 'Marathon') {
let days = 50;
} else if (event === 'Triathlon') {
let days = 100;
} else if (event === 'Pentathlon') {
let days = 200;
}
return days;
};
// The scope of `name` is too tight
// 문제 ③ 'name' 변수가 너무 타이트하다.
// logEvent() 함수와 logTime()함수에서 동일한 변수명을 쓰고 있다.
// 다른 함수의 지역변수에서 동일한 변수명으로 다르게 쓰이는 것은 scope pollution 가능성이↑
// name을 지역변수에서 전역변수로 빼낸다.
const logEvent = event => {
const name = 'Nala';
console.log(`${name}'s event is: ${event}`);
};
const logTime = days => {
const name = 'Nala';
console.log(`${name}'s time to train is: ${days} days`);
};
const event = getRandEvent();
const days = getTrainingDays(event);
// Define a `name` variable. Use it as an argument after updating logEvent and logTime
// 'name' 변수명을 정의하는 것을 logEvent 와 logTime을 사용하기 전에, 언급하는 것이 좋을듯.
logEvent(event);
logTime(days);
(Scope Pollution을 수정한 코드)
// The scope of `random` is too loose
// 전역변수로 정의내린, random 변수를 getRandEvent() 함수 안으로 넣었다.
const getRandEvent = () => {
const random = Math.floor(Math.random() * 3);
if (random === 0) {
return 'Marathon';
} else if (random === 1) {
return 'Triathlon';
} else if (random === 2) {
return 'Pentathlon';
}
};
// The scope of `days` is too tight
// if 구문 마다 있던, days 지역변수를 블록문에서 console.log 할 때 오류가 나기 때문에,
// if 구문 밖 블록문 안에 days 변수를 정의해준다.
const getTrainingDays = event => {
let days
if (event === 'Marathon') {
days = 50;
} else if (event === 'Triathlon') {
days = 100;
} else if (event === 'Pentathlon') {
days = 200;
}
return days;
};
// The scope of `name` is too tight
// 두 함수에서 동일한 이름'name'의 정의를 내리고 있기 때문에, 오류 발생↑
// 함수마다 지역변수로 되어있던, name을 빼내어, 함수를 호출하기 전에 선언하는 것을 한다.
// 또한, 함수마다 블록에 정의되던 name을 parameter로 넣는다.
// 호출할 때의 parameter 역시 수정해야한다.
const logEvent = (name,event) => {
console.log(`${name}'s event is: ${event}`);
};
const logTime = (name,day) => {
console.log(`${name}'s time to train is: ${days} days`);
};
const event = getRandEvent();
const days = getTrainingDays(event);
// Define a `name` variable. Use it as an argument after updating logEvent and logTime
// name 변수선언을 전역변수로 수정한다.
// 함수를 호출할 때, parameter 역시 수정한다.
const name = 'Nala';
logEvent(name,event);
logTime(name,days);
//
const event2 = getRandEvent();
const days2 = getTrainingDays(event2);
const name2 = 'Warren';
logEvent(name2, event2);
logTime(name2, days2);
**(수정한 코드의 결과값)**