[JavaScript] use strict

김방울·2025년 4월 8일
0

JavaScript

목록 보기
8/8

엄격 모드란?

일반 JavaScript를 사용할 경우 존재하지 않는 속성이나 객체, 변수, 쓰기 불가능한 값 등에 실수로 값을 할당하면 오류를 발생시키지 않고 새로운 전역 변수가 생성됩니다.
use strict 를 선언하여 엄격 모드를 사용하면 오류가 발생하여 실수로 전역 변수를 생성하는 것이 불가능해지며 더 안정적인 코드를 작성할 수 있습니다.

"use strict";
x = 3.14; // 일반 Javascript에서는 전역 변수 생성, 엄격 모드에서는 오류가 발생

엄격 모드 적용

엄격 모드는 'use strict'; 구문을 다른 코드를 작성 전에 선언하여 적용이 가능하며,
전체 스크립트 또는 함수 단위(eval, function, 이벤트 핸들러)로 적용이 가능합니다.

// 전체 스크립트 엄격 모드 구문
"use strict";
var v = "Hi!  I'm a strict mode script!";
// 함수 단위 엄격 모드 적용
function strict() {
  // 함수-레벨 strict mode 문법
  "use strict";
  function nested() {
    return "And so am I!";
  }
  return "Hi!  I'm a strict mode function!  " + nested();
}
function notStrict() {
  return "I'm not strict.";
}

JavaScript 모듈의 경우, use strict를 명시해 주지 않아도 자동으로 엄격 모드가 적용됩니다.

function strict() {
  // 모듈의 경우, use strict를 선언해 주지 않아도 엄격 모드 적용
}
export default strict;

엄격 모드에서 금지되는 것

전역 변수의 할당

오탈자 등의 실수로 글로벌 변수 및 객체를 생성하는 것을 불가능하게 합니다.

"use strict";
// 전역 변수 mistypedVariable 이 존재한다고 가정
mistypedVaraible = 17; // 변수의 오타때문에 이 라인에서 ReferenceError 를 발생시킴
x = {p1:10, p2:20}; // ReferenceError

쓸 수 없는 프로퍼티에 값 할당

NaN, undefined 등 특정 의미를 가지고 있는 전역 변수에 값을 할당하려고 하거나 확장 불가능한 객체에 새 프로퍼티를 할당하는 것이 불가능해집니다.

"use strict";

// 쓸 수 없는 프로퍼티에 할당
var undefined = 5; // TypeError 발생
var Infinity = 5; // TypeError 발생

// 쓸 수 없는 프로퍼티에 할당
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // TypeError 발생

// getter-only 프로퍼티에 할당
var obj2 = {
  get x() {
    return 17;
  },
};
obj2.x = 5; // TypeError 발생

// 확장 불가 객체에 새 프로퍼티 할당
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // TypeError 발생

변수, 객체, 함수 삭제

"use strict";
let x = 3.14;
delete x;  // Error

function y(p1, p2) {};
delete y; // Error 

매개변수 이름 중복

function sum(a, a, c) {
  // 매개변수 'a' 가 중복으로 선언되어 있음, 구문 에러
  "use strict";
  return a + b + c;
}

8진 구문 사용

숫자 앞에 '0'을 붙여 사용하는 8진 구문을 금지합니다.

"use strict";
var sum =
  015 + // 구문 에러
  197 +
  142;

원시 타입에 프로퍼티 할당

string, number, boolean 등 객체가 아니면서 메서드 또는 속성도 가지지 않는 데이터에 프로퍼티를 할당하는 것이 불가능해집니다.

(function () {
  "use strict";

  false.true = ""; // TypeError
  (14).sailing = "home"; // TypeError
  "with".you = "far away"; // TypeError
})();

with문 사용

객체를 명시하지 않고 프로퍼티와 메서드를 참조하는 with 구문을 사용하지 못하게 합니다.

"use strict";
with (Math) { // 구문 에러
  // Math를 기본 객체로 지정하여 프로퍼티, 메서드 참조
  a = PI * r * r;
  x = r * cos(PI);
  y = r * sin(PI / 2);
}

eval() 내에서의 변수 선언

보안상의 이유로 eval() 이 호출된 범위 내에서 변수 생성이 불가능해집니다.

"use strict";
eval ("x = 2");
alert (x);  // Error

eval ("var x = 2"); // 엄격 모드에서는 eval() 이 var, let 키워드를 사용하여 변수 생성 불가능
alert (x);    

차기 자바스크립트 버전의 예약어를 변수로 사용

다음 자바스크립트 버전에서 예약어로 쓰이는 단어들은 엄격 모드에서 변수 이름으로 사용할 수 없습니다.

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield

this

this 키워드는 함수를 호출한 객체를 참조합니다. 객체가 지정되지 않았을 경우 일반 모드의 함수는 전역 객체인 window 를 반환하지만, 엄격 모드에서는 undefined 를 반환합니다.

"use strict";
function myFunction() { 
  alert(this); // "undefined" 가 출력됨
}
myFunction(); // 객체 안에서 myFunction 을 호출하지 않음 

참고자료

profile
코딩하는 고양이🐱 / UI Developer, Front-end Developer

0개의 댓글

관련 채용 정보