Dev-dotoli TIL

JS 18 scope 2



scope / 전역변수의 사용


불가피하게 전역변수를 사용해야 할 때


var MYAPP = {};

MYAPP.calculator = {
  left: null,
  right: null,
};
//

MYAPP.coordinate = {
  left: null,
  right: null,
};
//coordinate(좌표)

//calculator에서 (left+right)
//coordinate에서는 왼쪽과 오른쪽의 위치상 의미

MYAPP.calculator.left = 10;
MYAPP.calculator.right = 20;

function sum() {
  return MYAPP.calculator.left + MYAPP.calculator.right;
}

document.write(sum());
// : 30

// 전역변수 MYAPP 하나에 함수로 값을 지정함

1번

(function () {
  var MYAPP = {};

  MYAPP.calculator = {
    left: null,
    right: null,
  };

  MYAPP.coordinate = {
    left: null,
    right: null,
  };

  MYAPP.calculator.left = 10;
  MYAPP.calculator.right = 20;

  function sum() {
    return MYAPP.calculator.left + MYAPP.calculator.right;
  }

  document.write(sum());
})();
//이렇게 함수로 다 감싸버리면
//MYAPP은 함수안의 지역변수가 됨

2번

function myappfn() {
  var MYAPP = {};

  MYAPP.calculator = {
    left: null,
    right: null,
  };

  MYAPP.coordinate = {
    left: null,
    right: null,
  };

  MYAPP.calculator.left = 10;
  MYAPP.calculator.right = 20;

  function sum() {
    return MYAPP.calculator.left + MYAPP.calculator.right;
  }

  document.write(sum());
}
myappfn();

// 이렇게 함수 명을 설정해서 호출할 수도 있음
// 하지만 이경우에는 myappfn이 전역변수가 되기때문에
// 단하나의 전역변수도 허용하지않으려면 1번 방법이 유효

이렇게 함수를 정의하고 바로 호출하는 방법을 익명함수 라고 함
이런 기법으로 전역변수가 전혀 존재하지 않는
애플리케이션을 구축할 수 있고
jquery등 많은 library에서 module화로 사용하는 방법



유효범위의 대상


JS에서

for (var i = 0; i < 1; i++) {
  var name = "coding everybody";
}
// JS에서는 for문 밖에서도 유효한 변수임

alert(name);
// JS에서는 함수의 중괄호 안에서 선언된 변수만이
// 함수의 지역변수가 되는 것

// for, if문 중괄호 안에서 선언된 변수는
// 지역변수가 아님

JAVA에서

for(int i = 0; i < 10; i++){
    String name = "egoing";
}
// string name 부분은
// JS에서 var name = 'egoing'; 과같음

System.out.println(name);
// console.log(name);

// : error

// for문 내에서의 지역변수 이기때문에
// 외부에서 호출하면 error가 남



정적 유효 범위


JS는 함수가 선언된 시점에서의 유효범위를 가지게 됨
이런 방식을
정적 유효범위(static scoping),
어휘적 유효범위(lexical scoping) 라고 함


var i = 5;
//전역변수 i

function a() {
  var i = 10;
  b();
}
// a라는 함수를 정의하는데
// i라는 지역변수를 가지고 있고 값은 10
// 함수a는 b라는 함수를 가지고있는데,

function b() {
  document.write(i);
}
//함수 b는 i를 출력하도록 정의되어있음

//여기서 i는 누구인가?

a();
// : 5

// a가 실행 - a안에있는 b를 확인 - b를 실행
// b는 함수내에 i가 있는지 검색 - 존재x
// 이때 함수b가 계산되는(선언되는) 시점에서
// 정의되어있는 변수는
// 전역함수 i 이므로 5가 검색됨

사용 될 때 X
정의 될 때 o

= 정적 유효범위 stactic scoping



코딩초기에는 큰 문제가 없을텐데,

프로그램의 몸집이 커지면 처음 겪고 이해할 수 없는

오류들이 나기 시작할텐데 높은 확률로

scope에 관련된 문제임

global / local variable의 개념을 잘 잡아두면

문제를 해결하는데 큰 도움이 될 것