
'use strict';는 JavaScript 코드를 엄격 모드(strict mode)로 실행하도록 지시하는 선언이다. 이 모드는 ECMAScript 5 (ES5)에서 도입되었으며, JavaScript를 좀 더 예측 가능하고, 디버깅하기 쉽게 만들어주는 몇 가지 변경사항을 가지고 있다.
변수 선언 강제: 엄격 모드에서는 선언되지 않은 변수에 값을 할당하려고 하면 에러가 발생한다. 이는 전역 변수의 사용을 줄이고, 변수의 유효 범위(scope)를 명확히 하는 데 도움을 준다.
조용한 실패 방지: 일반 모드에서는 실패를 조용히 무시하는 특정 작업들이 에러를 발생시킨다. 예를 들어, 쓰기 금지 속성(write-protected property)에 값을 할당하려고 하면 에러가 발생한다.
안전한 JavaScript: with문과 같이 오해의 소지가 있는 기능들을 사용할 수 없게 하여 코드를 더 예측 가능하게 만든다.
더 나은 최적화: 일부 JavaScript 엔진은 엄격 모드 코드를 더 효과적으로 최적화할 수 있으므로, 실행 속도가 향상될 수 있다.
미래의 JavaScript 버전과의 호환성: 엄격 모드는 미래의 ECMAScript 버전에서 문제가 될 수 있는 구문이나 키워드 사용을 금지함으로써, 코드가 미래의 JavaScript 버전과의 호환성을 유지하도록 도와준다.
엄격 모드를 사용하는 방법은 간단하다. JavaScript 파일의 맨 위나 함수의 첫 줄에 'use strict';를 추가하면 된다. 이 선언은 문자열이며, JavaScript 엔진이 이를 엄격 모드의 지시어로 인식한다.
'use strict';
function canDrive(age) {
if(age < 18) {
console.error('Too young');
return false;
}
return true;
}
canDrive(16); // Error: Too young
엄격 모드에서의 변화를 더 잘 이해하기 위해, 다음은 엄격 모드가 아닐 때와 엄격 모드일 때의 차이점을 보여주는 예시이다:
function nonStrictModeExample() {
undeclaredVar = 'This is not good practice'; // 전역 변수가 됨
console.log(undeclaredVar); // 출력: This is not good practice
}
nonStrictModeExample();
console.log(undeclaredVar); // 전역 범위에서도 접근 가능하다.
'use strict';
function strictModeExample() {
undeclaredVar = 'This will cause an error'; // ReferenceError 발생
console.log(undeclaredVar);
}
strictModeExample();
엄격 모드에서 undeclaredVar에 값을 할당하려고 하면, ReferenceError가 발생하여 코드 실행이 중단된다. 이는 변수가 선언(초기화)되지 않았기 때문이다.
엄격 모드가 적용되면, JavaScript 코드는 더 엄격한 오류 체크를 통해 실행된다. 이로 인해 일반 모드에서 무시되거나, 실패하지 않는 여러 작업들이 엄격 모드에서는 오류를 발생시킨다. 이는 개발자가 잠재적인 오류를 미리 인지하고, 보다 견고한 코드를 작성하도록 유도한다.
엄격 모드에서는 this 키워드가 전역 객체(global object)를 참조하지 않는다. 이는 함수가 객체의 메서드로서 호출되지 않았을 때 this의 값이 undefined가 되는 것을 의미한다.
function logThis() {
console.log(this);
}
logThis(); // 전역 객체를 출력 (브라우저에서는 window 객체)
'use strict';
function logThis() {
console.log(this);
}
logThis(); // undefined를 출력
엄격 모드에서는 함수의 caller나 callee 속성에 접근하는 것이 금지된다. 이 속성들은 함수가 어디서 호출되었는지, 혹은 현재 실행 중인 함수를 참조하는 기능을 제공하는데, 이는 보안상의 이유로 엄격 모드에서는 사용할 수 없다.
function whoCalled() {
console.log(whoCalled.caller);
}
function callerFunction() {
whoCalled(); // whoCalled 함수를 호출하는 callerFunction을 출력
}
callerFunction();
'use strict';
function whoCalled() {
console.log(whoCalled.caller); // TypeError 발생
}
function callerFunction() {
whoCalled();
}
callerFunction();
엄격 모드에서는 eval 함수를 사용하여 코드를 실행하는 것이 제한된다. eval을 사용하여 생성된 변수나 함수는 eval이 실행된 자신의 스코프 안에서만 존재하며, 외부 스코프로 침투하지 않는다. 또한, arguments 객체는 함수 호출 시 제공된 인수를 정확히 반영한다. 이 객체에 할당을 시도하면 예외가 발생하지 않지만, 변경사항은 무시된다.
function evalExample() {
eval('var evalVar = "created by eval";');
console.log(evalVar); // 출력: created by eval
}
evalExample();
'use strict';
function evalExample() {
eval('var evalVar = "created by eval";');
console.log(evalVar); // ReferenceError: evalVar is not defined
}
evalExample();
엄격 모드에서는 향후 버전의 JavaScript에서 사용될 수 있는 단어들을 예약어로서 사용하는 것이 금지된다. 예를 들어 implements, interface, let, package, private, protected, public, static, yield 등은 변수명이나 함수명으로 사용할 수 없다.
'use strict';
var public = 123; // SyntaxError: Unexpected strict mode reserved word
엄격 모드는 개발자가 더 나은 코드를 작성할 수 있도록 유도하는 매우 유용한 기능이다. 실수로 인한 버그를 줄이고, 보안을 강화하며, 향후 JavaScript 표준의 발전에 따른 코드 호환성을 보장하는 데 도움을 준다.
그러나 기존의 코드 베이스에 엄격 모드를 적용하는 것은 호환성 문제를 야기할 수 있으므로, 새로운 프로젝트나 모듈에서 주로 사용하는 것이 권장된다. 엄격 모드의 사용은 선택 사항이긴 하지만, 모던 JavaScript 개발에서는 표준적인 관행이 되고 있다.