https://s3-us-west-2.amazonaws.com/secure.notion-static.com/769b5a65-6c4f-499c-be1a-77895fee9198/Untitled.png

(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);
                                                       **(수정한 코드의 결과값)**

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1791198c-41dc-490a-836c-c9d5920d61e6/Untitled.png