본문 바로가기
Web/Javascript

나쁘지만 사용해야 하는 부분

by juein 2018. 2. 28.

[나쁘지만 사용해야 하는 부분]

- 자바스크립트에서 나쁘지만 피하기 힘든 문제가 있는 부분들을 잘 인지하여 사용할 수 있도록 하자.



전역변수

- 전역변수는 모든 유효범위(scope) 에서 접근할 수 있는 변수.


- 전역변수를 잦게 사용하면 플러그인 충돌, 다른 영역에서 다른 목적으로 

   동일한 전역변수를 정의할 경우 덮어쓰게 되는 점 등의 오류가 발생하고 어디가 잘못되었는지 찾기 힘들다.


- 전역변수의 생성은 세가지가 있다.

1) 어떠한 함수에도 속하지 않은 위치에서 (함수 밖에서) var 문으로 선언

 var test = 'test';


2) 전역객체에 직접적으로 속성을 추가.

 window.test = 'test';


3) var 없이 변수를 선언 (함수 내에서도 var 없이 선언하면 전역변수가 된다)

 test = 'test';


이러한 방법들은 초보자들이 변수를 선언하지 않아도 사용할 수 있게 하기 위해서 고안된 부분들이다.

※최소한의 전역변수를 사용하는 부분은 chapter 3에서의 설명 참고



유효범위

- 대부분의 언어에서는 일반적으로 변수가 처음 사용되는 지점에서 변수를 선언하는 것이 좋지만,

  자바스크립트에서는 모든 변수는 함수의 맨 위에 선언하는것이 좋다.

  이로인해 변수 초기화의 실수를 최소화 할 수 있고, minification에 유리하다.


- 자바스크립트의 minification이란 소스의 사이즈를 줄여서 다른사람이 사용할 때의

  소스의 크기를 최대한 줄여서 성능 최적화를 할 수 있는 프로세스다.

  이때 var 변수를 산단에 정의해둔 소스파일이 압축율이 훨씬 더 좋기때문에

  변수선언의 위치는 항상 습관을 들여두도록 하자.



세미콜론 삽입

- 세미콜론의 삽입 위치에 따라 프로그램이 잘못 해석하게 되는 경우가 있다.

ex) return 문으로 값을 반환할때의 세미콜론은 반드시 return문과 같은 줄에 있어야 한다.

var test = function(){
    return {
        test_return: true
    };
}

console.log( test() );   // <-- Object{ test_return: true } 출력
var test = function(){
    return    // <-- return 문 한줄로 반환이 끝난걸로 인식한다.
    {
        test_return: true
    };
}

console.log( test() );   // undefined 출력


+ 연산자

- + 연산자는 숫자타입의 덧셈을 하거나 문자열을 연결한다.

  연산하는 값 중 문자열이 하나라도 포함되어있으면 나머지 숫자형의 값도 문자열로 변환하여 결과값을 돌려준다.

 + 연산자를 더하기로 사용한다면 반드시 숫자형인지 먼저 체크를 해주어야한다.



거짓인 값들

- 자바스크립트의 null, ''(빈문자열), false, NaN(숫자가 아님), undefined 이러한 값들은 거짓인 값 들이다.

  그 중 NaN 과 undefined 는 상수가 아니다. 이 둘은 전역변수여서 원하는 경우에는 값을 변경하는것이 가능하다.

  실제로 변경이 불가능 해야하는것이 맞으므로 절대 undefined와 NaN의 값을 변경해서는 안된다.




[나쁜점들]

- 자바스크립트에서 사용할 경우 문제가 될 수 있는 부분이며  사용하지 않을수록 좋고, 쉽게 피할수 있는 부분들이다.



비교연산자

- 자바스크립트는 비교 연산자로 === / !== 가 있지만, 나쁜 방식으로 == / != 도 존재한다.

if( '' == '0' ? console.log('true') : console.log('false') );          // <-- false 출력
if( 0 == '' ? console.log('true') : console.log('false') )             // <-- true 출력
if( 0 == '0' ? console.log('true') : console.log('false') )            // <-- true 출력

if( false == 'false' ? console.log('true') : console.log('false') )    // <-- false 출력
if( false == '0' ? console.log('true') : console.log('false') )        // <-- true 출력

if( false == undefined ? console.log('true') : console.log('false') )  // <-- false 출력
if( false == null ? console.log('true') : console.log('false') )       // <-- false 출력
if( null == undefined ? console.log('true') : console.log('false') )   // <-- true 출력

- 위에있는것은 === 연산자를 사용하면 모두 거짓이다.

  이처럼 서로 다른 값인데도 비교연산자를 통해 true 로 나올 경우가 있으므로 반드시 == / != 는 사용하지 않도록 한다.



eval 함수

- eval 함수는 문자열을 자바스크립트 컴파일러에 넘긴 후 결과를 실행시키는 함수이다.

var dateFn = "Date(2017,12,25)";
var myDate;

eval("myDate = new " + dateFn + ";");

console.log('eval을 사용 : ' + myDate);   // <-- Thu Jan 25 2018 00:00:00 GMT +0900 (대한민국 표준시)

myDate2 = new Date(2017,12,25);
console.log('eval 미사용 : ' + myDate2);  // <-- Thu Jan 25 2018 00:00:00 GMT +0900 (대한민국 표준시)

- eval을 사용한 코드는 읽기도 매우 어렵고, 단순한 할당문 실행을 위하여 컴파일러를 기동해야 하므로 속도저하가 생긴다.


- eval은 대부분 자바스크립트에 대한 온전한 이해가 없는 사람들이 가장 많이 사용한다.

  자바스크립트 에서는 대부분의 경우가 eval함수를 사용하지 않고서도 

  충분히 동일한 동작을 구현할 수 있는 경우가 많으므로 eval함수의 사용은 권장되지 않는다.



블록이 없는 문장

- if/while/do/for 문은 블록 없이 문장 하나만으로도 사용할 수는 있다.

  이 형식은 문장 하나만을 사용하는 점이 장점처럼 보이지만 추후에 작업하는 사람이 쉽게 버그를 만들 수 있으므로 권장하지 않는다.



함수 문장 vs 함수 표현식

- 함수가 선언식으로 (function test(){} ) 선언 될 경우 함수 문장은 윌 ㅗ끌어올려지는 대상(호이스팅) 이 되기 때문에

  함수가 위치한 곳과 관계없이 실행될수 있으므로 구조를 엉성하게 만든다.

  함수의 선언을 할 때 표현식 (var test = function(){} ) 를 사용하길 권장한다.


'Web > Javascript' 카테고리의 다른 글

[Javascript] 간단한 아코디언 토글  (0) 2019.04.12
[javascript] 변수/상수 - var, let, const  (0) 2018.03.01
정규표현식  (0) 2018.02.28
배열  (0) 2018.02.28
상속  (0) 2018.02.27

댓글