use strict
자바스크립트는 매우 유연한 언어로 개발자가 코드상 오류를 범해도 브라우저에서는 오류로 표시하지 않고 넘어가는 경우가 많다. 이러한 유연성은 개발자가 오류를 정확히 인지하지 못하는 위험으로 다가오기 때문에 항상 'use strict'모드를 JavaScript 파일 맨 윗줄에 사용하여 안전한 코드 작성을 하도록 하자.
예를 들어 자바스크립트에서는 선언되지 않은 변수에 값을 할당해도 브라우저상에서 문제가 발생하지 않는다.
그러나 use strict 모드를 사용하면 브라우저에 error를 띄워서 잘못된 점을 찾아준다.(내 잘못을 컴퓨터가 찾아줄 수 있다.)
let vs var
let과 var은 둘다 변수를 선언하기 위해 사용된다.
block-level scope
기본적으로 javascript는 블록 레벨 스코프를 따른다. 이는 하나의 블록단위로 block scope 안에서 작성된 변수들은 block scope 바깥에서 호출할 수 없다. 그러나 block scope안에서는 바깥에 선언된 변수나 함수를 가져와 사용할 수 있다.
그러나 var라는 놈은 block scope 안에서 정의해도 block scope 바깥에서 호출될 수 있다. var는 블록 레벨 스코프를 따르지 않고 함수 레벨 스코프를 따른다.
hoisting
var로 변수를 선언하게 될 경우, 선언하기도 전에 값을 할당할 수 있다(let에서는 오류가 나고 이것이 정상). 그리고 값을 할당하기 전에 그 값을 출력할 수도 있다(undefined가 출력됨).
도대체 왜 그러는 것일까?
이는 hoisting이라는 현상 때문이다.
hoisting을 쉽게 설명하면 var로 변수를 정의할 때는 마치 var로 정의한 코드가 JavaScript 맨 윗줄로 올라가 선언되는 것처럼 동작하는 JavaScript 고유의 특징이다.
var hoisting의 동작방식을 더 깊게 들어가보면 런타임 이전에 자바스크립트엔진에 의해 변수 선언과 초기화를 동시에 실행하고(undefined로 초기화), 그 후에 코드 한줄한줄 순서대로 런타임에서 값의 할당을 하게 되기 때문에 위의 예시와 같은 hoisting이 발생한다.
console.log(a+b); //NaN
var a = 1;
var b = 2;
console.log(a+b);
// Uncaught ReferenceError: Cannot access 'a' before initialization
let a=1;
let b=2;
const
const는 상수를 선언하기 위해 사용한다.
const를 이용하는 이유는 크게 3가지가 있다.
1. 보안상: 다른 해커들이 변수값을 바꿀 수 없게 한다.
2. Thread safety: 어플리케이션이 실행되면 한 가지의 프로세스가 실행되고, 프로세스 안에서는 여러가지의 thread들이
동시에 동작하여 어플리케이션이 빠르게 동작할 수 있도록 도와준다. 이때 다양한 thread들에서 동시에 같은 변수에 접근해서 값을 변경하게 되면 위험하기 때문에 이를 방지하기 위해서
3. 인간의 실수 방지: 1달 후의 나, 혹은 다른 개발자들이 const로 정한 값들을 변경할 수 없도록 하여 코드상의 실수를 방지한다.
참고자료
모던자바스크립트 Deep Dive
'JavaScript' 카테고리의 다른 글
[JS] reduce() 사용법 (0) | 2021.08.28 |
---|---|
[JS] All about Function (0) | 2021.07.31 |
[JS] forEach()와 map() 차이점 (2) | 2021.07.27 |
[JS] JavaScript Operator (0) | 2021.07.24 |
[JS] HTML에서 JavaScript를 불러오는 4가지 방법 (0) | 2021.07.21 |