[JavaScript] strict mode

2025. 2. 1. 16:18·JavaScript
728x90
반응형
SMALL

자바스크립트에서는 여러모로 암묵적으로 에러를 발생시키지 않는 경우가 허다하다.

이는 유연한 프로그래밍이라고 할 수도 있지만, 복잡한 버그를 발생시킬 수 있다.

 

따라서 우리는 이를 좀 더 엄격하게, 틀에 가두어 사용하기 위해 strict mode를 사용할 수 있다.

 

우선, strict mode의 사용법이다.

'use strict';

function hello(){
    x = 100;
    console.log(x);
}

hello();

 

strict mode를 사용할 곳에 'use strict'를 작성해주면 된다.

이 'use strict'가 작성된 곳부터 적용되기 때문에, 'use strict' 위에 있는 코드가 있다면 그 코드는 strict mode가 적용되지 않는다.

 

 

이러한 strict mode를 사용하여 예방할 수 있는 문제는 아래와 같다.

  • 암묵적 전역
  • 변수 , 함수, 매개변수의 삭제
  • 매개변수 이름의 중복
  • with 문 사용

 

암묵적 전역은 선언되지 않은 변수를 자바스크립트 엔진이 암묵적으로 전역 변수로 선언하는 것이다.

function hello(){
    x = 1000;
    console.log(x);
}

hello();

 

위 코드에서 x를 선언한 코드는 존재하지 않는다. 함수 스코프 내에 x가 존재하지 않으므로 전역 스코프로 이동하여 찾을 것이고, 전역 스코프에도 없기 때문에 에러가 나야할 거 같다.

하지만 자바스크립트 엔진이 x를 전역 변수로 암묵적으로 선언한다.

 

이러한 문제에 strict mode를 사용하여 에러를 발생시킬 수 있는 것이다.

 

 

변수와 함수, 매개변수를 삭제하는 경우에도 원래는 아무 에러를 발생시키지 않지만, strict mode에서는 SyntaxError를 발생시킨다.

'use strict';

var x = 1010;
delete x; // SyntaxError : Delete of an unqualified identifier in strict mode.

 

 

매개변수 이름의 중복도 원래는 자바스크립트 엔진이 에러를 발생시키지 않는다. strict mode를 사용하면 이 또한 SyntaxError를 발생시킨다.

'use strict';

function hello(x, x){
	return x + x; // SyntaxError : Duplicate parameter name not allowed in this context.
}

console.log(hello(1,2));

 

 

with 문은 전달된 객체를 스코프 체인에 추가하는 문이다. 스코프 체인을 건드리는 만큼 잘 사용하면 코드가 간단해지지만 잘못 사용한다면 코드에 치명적인 문제를 야기할 수 있으므로 사용하지 않는 것이 좋다. 

strict mode에서는 with문을 사용하면 바로 SyntaxError를 발생시킨다.

'use strict';

with({x:1}){
	console.log(x); // SyntaxError : Strict mode code may not inclue a with statement
}

 

 

 

기본적으로 자바스크립트는 굉장히 유연한 언어이기 때문에 그대로 사용한다면 발생할 수 있는 문제점이 상당수 존재한다.

그게 우리가 자바스크립트에 대해 깊게 공부하고 코드를 작성해야 하는 이유라고 생각한다.

 

그리고 개인적인 생각으로는 이렇게 통통 튀는 점이 바로 자바스크립트의 매력인 거 같다. ❤️

728x90
반응형
LIST
저작자표시 비영리 변경금지 (새창열림)

'JavaScript' 카테고리의 다른 글

[JavaScript] 함수는 왜 객체인가 ?  (0) 2025.01.31
[JavaScript] 생성자 함수를 통한 객체 생성(new Object()), 특징, constructor, non-constructor  (0) 2025.01.24
[JavaScript] var, let, const 키워드, 함수 레벨 스코프(Function-level scope), 블록 레벨 스코프(Block-level scope)  (0) 2025.01.23
[JavaScript] 스코프(scope), 렉시컬 환경(lexical environment), 스코프 체인(scope chain)  (1) 2025.01.22
[JavaScript] 함수 선언(Function Declaration), 함수 선언문, 함수 표현식, Function 생성자 함수, 화살표 함수(Arrow Function)  (0) 2025.01.21
'JavaScript' 카테고리의 다른 글
  • [JavaScript] 함수는 왜 객체인가 ?
  • [JavaScript] 생성자 함수를 통한 객체 생성(new Object()), 특징, constructor, non-constructor
  • [JavaScript] var, let, const 키워드, 함수 레벨 스코프(Function-level scope), 블록 레벨 스코프(Block-level scope)
  • [JavaScript] 스코프(scope), 렉시컬 환경(lexical environment), 스코프 체인(scope chain)
미누라니까요
미누라니까요
안녕하세요. 개발은 정말 신나는 짓이에요. 이론보다 실습을 더 좋아하는 불도저 타입이랍니다.
  • 미누라니까요
    미누에요
    미누라니까요
  • 전체
    오늘
    어제
    • 분류 전체보기 (367)
      • 우당탕탕개발기록 (11)
      • Machine Vision (1)
      • JavaScript (33)
      • Frontend (62)
      • AI (30)
      • C++ (79)
      • Java (48)
      • Python (8)
      • 자료구조 (25)
      • Arduino (3)
      • Project (2)
      • 알고리즘 (51)
      • Git & Github (6)
      • Backend (5)
      • 회고록 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • instagram
  • 공지사항

  • 인기 글

  • 태그

    제네릭
    wrapper
    컬렉션
    카카오톡 링크 공유 미리보기
    og태그
    java
    개발
    integer
    generic
    Collection
    open graph
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
미누라니까요
[JavaScript] strict mode
상단으로

티스토리툴바