Strict Mode

Bonggus·2021년 10월 12일
0

자바스크립트

목록 보기
2/23
post-thumbnail

stirct mode?

function foo() {
	x = 10;
}

foo();
console.log(x);

// x = 10

x를 함수 내에서 선언했음에도 console.log(x)는 10의 값이 나온다. foo함수가 실행되면 자바스크립트는 x변수를 찾아야 x를 할당할 수 있기 때문에 x변수가 어디에서 선언되었는지 스코프 체인을 통해 찾기 시작한다.

자바스크립트 엔진은 먼저 foo함수 스코프에서 x 변수 선언을 검색한다. foo함수 스코프에는 x변수 선언이 없기 때문에 탐색에 실패하고, 상위 스코프에서 x선언을 검색한다.

전역스코프에도 x변수의 선언은 없다. 하지만 자바스크립트 엔진은 암묵적으로 전역객체에 x 프로퍼티를 동적으로 생성한다. 이때 전역 객체의 x 프로퍼티는 마치 전역 변수처럼 사용가능하다. 이러한 현상을 암묵적 전역implicit global이라 한다.

이러한 현상은 개발자의 의도와 상관없이 일어나는 일이다(의도했다면 할말없다). 오류의 원인이 될 가능성이 높다. 따라서 반드시 var, let, const 키워드를 사용해 변수를 선언한 다음 사용해야한다.

잠재적인 오류를 발생시키기 어려운 개발 환경을 만들고, 그 환경에서 개발하는 것이 예상치못한 오류를 막는 근본적인 해결책일 것이다. 이를 지원하기위해 ES5부터 **strict mode**가 추가되었다. strict mode는 자바스크립트 언어의 문법을 조금 더 엄격히 적용하여 오류를 발생시킬 가능성이 높거나, 엔진 최적화 작업에 문제를 일이킬 수 있는 코드에 대해 명시적인 에러를 발생시킨다.

ESLint같은 도구를 사용해도 strict mode와 유사한 효과를 얻을 수 있다. 린트 도구는 정적 분석 기능을 통해 소스코드를 실행하기 전에 소스코드를 스캔하여 문법적 오류와 잠재적인 오류를 찾아내고, 원인을 알려준다.

stirct mode 적용

strict mode를 사용하는 방법은 간단하다. 전역 선두(맨위) 함수 몸체 선두(맨위) use strict를 추가한다. 전역 선두에 선언할 경우 스크립트 전체는 strict mode가 된다.

'use strict'
function foo() {
	x = 10;
}

foo();
console.log(x);

// x not defined


function foo() {
  'use strict'
	x = 10;
}

foo();
console.log(x);

// x not defined

전역에 strict mode를 적용하는 것은 피하자

스크립트 단위로 적용된 strict mode는 다른 스크립트에 영향을 주지 않고, 해당 스크립트에 한정되어 적용된다. 하지만 strict mode 스크립트와 non-strict mode 스크립트를 혼용하여 사용하는 것은 오류를 발생시킬 수 있다. 특히, 외부 라이브러리를 사용하는 경우 non-strict mode인 경우가 있어서 전역에 사용할 경우 오류를 발생시킬 수 있다.

함수 단위로 strict mode를 적용하는 것도 피하자

어떤 함수는 strict mode, 어떤 함수는 적용하지 않는 것은 바람직하지 않다. 모든 함수에 일일이 strict mode를 적용하는 것도 번거로운 일이다. 그리고 strict mode가 적용된 함수가 참조할 함수 외부의 컨텍스트에 strict mode를 적용하지 않는다면 이 또한 문제가 된다.

위 함수 스코프 선언된 변수에 접근이 제한된다.

strict mode가 발생시키는 에러

1. 암묵적 전역

선언하지 않은 변수를 참조하면 referenceError가 발생한다.

2. 변수,함수,매개변수의 삭제

delete 연산자로 변수, 함수, 매개변수를 삭제하면 syntaxError가 발생한다.

3. 매개변수 이름의 중복

중복된 매개변수 이름을 사용하면 syntaxError가 발생한다.

4. with문의 사용

with문을 사용하면 syntaxError가 발생한다. with문은 전달된 객체를 스코프 체인에 추가한다. 동일한 객체의 프로퍼티를 반복해서 사용할 때 객체 이름을 생략할 수 있어서 코드가 간단해지는 효과가 있지만, 성능과 가독성에 문제가 있다.

5. 일반 함수의 this

strict mode에서 함수를 일반 함수로서 호출하면 this에 undefined가 바인딩된다. 생성자 함수가 아닌 일반 함수 내부에서는 this를 사용할 필요가 없기 때문이다.


6. arguments 객체

strict mode에서는 매개변수에 전달된 인수를 재할당하여 변경해도 arguments 객체에 반영되지 않는다.


Summary

strict mode를 왜 사용하는가에 대한 답은 개발자가 의도와 관련없는 일이 일어나는 것을 막기위한 환경을 만들어주는 것이라 생각한다.

개발자의 의도와 상관없이 일어나는 일로 인한 오류가 발생할 수 있기 때문에, 잠재적인 오류를 발생시키기 어려운 개발 환경을 만들고, 그 환경에서 개발하는 것이 예상치못한 오류를 막는 근본적인 해결책일 것. 이게 바로 strict mode

출처

모던자바스크립트 Deep Dive (이웅모)

profile
프론트엔드

0개의 댓글