js에는 여러 표준 에디션과 일부에서는 지원하지만 일부에서는 지원하지 않는 기능들도 많이 존재한다. 예를 들어 const의 경울 여러 js엔진들이 이를 지원하지만 ECMAScript에서는 const에 대한 어떤 문법이나 동작에 대해서 정의하고 있지 않다. 이때문에 어떤 경우에는 다음과같이 동작하고
const a = 3;
a = 'b';
a;//3
어떤 경우에는 var와 같이 동작한다.
const a = 3;
a = 'b';
a;//'b'
웹 브라우저는 개발자가 작성한 코드를 실행하기 위해 어떤 버전의 js를 사용해야 하는지 제어할 방법을 제공하지 않고 사용자의 브라우저 버전 또한 다를 수 있어 웹 프로그램은 모든 브라우저에서 지속적으로 동작 할 수 있도록 작성되어야 한다. 만약 js를 서버측 프로그램, 모바일, 데스크톱 애플리케이션을 위한 스크립팅으로 사용한다면 해당 플랫폼의 특정한 js구현에 부합하는 추가적인 기능들을 사용하는 편이 좋다.
위의 예시처럼 원하는기능이 제대로 작동되지 않는 것에 대한 대안으로 ES5에서는 strict모드가 추가되었다. 이는 특정 버전에서 오류 또는 문제를 일으킬만한 기능을 제한한다. 또한 하위 호환성이 유지되 strict모드를 구현하지 않은 환경에서도 strict모드의 코드를 실행할 수 있게 한다. 이 기능을 사용하기 위해선 파일 맨위 또는 함수의 첫부분에 "use strict";을 추가하면 된다.
문자 리터럴을 명령어로 사용하는 방식은 하위 호환성에 이점을 가진다. 문자 리터럴을 평가하는 것은 부작용이 없기 때문에 ES3엔진은 이 멸령어를 그냥 실행시킨다. 하지만 이 방식은 제한이 따른다. 오래된 엔진에서는 strict모드를 어떠한 확인도 하지 않고 실행시킨다.
function f(x){
"use strict";
var arguments = [];// error: override arguments
}
따라서 위와 같은 문제가 생길 수 있다. strict모드에서는 arguments에 대한 재정의가 허용되지 않지만 스트릭 모드 확인을 구현하지 않은 환경에서는 위와 같은 재정의를 허용한다. 따라서 strict모드는 반드시 ES5를 완전히 지원하는 환경에서 테스트를 해야한다.
strict모드를 사용할때 주의해야 할 다른 점은 strict모드는 오직 "user strict";을 파일 맨 위 또는 함수 맨 앞에 사용했을 때만 적용된다는 점이다. 만약 파일 두개를 병합할때 strict모드가 적용된 파일이 앞에 병합 된다면 strict 모드가 적용되지만 뒤에 병합된다면 적용이 되지 않는다. 이 문제를 해결하기 위해 다음과 같은 방법을 사용할 수 있다.
1. Strict 모드와 일반 모드의 파일을 병합하지 않는다
. 이는 애플리케이션이나 라이브럴리 파일 구조를 관리하는데 막대한 노력을 필요로한다. 스트릭 모드 파일, 일반 파일 두개의 분피된 파일로 배포를 하는것이 최선이다
2. 즉시 실행되는 함수 표현식을 사용해 파일들의 본문을 감싸라
파일 전체를 하나의 함수로 감싸는 것이다. 이러면 각 파일은 각각 별도의 스코프에 위치해 있기 때문에 strict 모드는 해당 파일의 내용에만 영향을 미친다. 하지만 이는 전역 스코프에서 해석된다는 장담을 할 수 없다. var 타입의 경우 선언이 전역으로 유지되지 않는다. 이 방법의 경우 파일들이 지역 스코프에 위치하고 있어서 strict모드의 사용여부를 개별적으로 결정할 수 있다.
3. 어떤 모드에 있던 동일하게 동작하도록 코드를 작성해라
다양한 컨테스틍서 작동되는 라이브러리를 만들기 위해서는 스크립트 병합 도구에 의한 함수 본문 중간에 삽입 되거나 클라이언트의 코드가 strict모드 또는 일반 모드일거라 단정해서는 안된다. 최대한의 호환성을 가지는 방법은 strict모드로 작성하되 이것이 지역적으로 활성화 되게 코드 전체를 함수로 감싸는 것이다. 이는 2번 방식과 비슷하지만 이 경우 병합 도구를 믿거나 모듈 시스템에 기대기 보다는 직접 함수 표현식을 작성해 명시적으로 strict 모드를 선택적으로 적용한다는 점이 다르다 .이 코드는 어떤 모드에 병합되도 strict 모드로 작동한다.
출처-Effective Jave Script