[Javascript] strict mode

고성인·2023년 12월 27일

Javascript

목록 보기
3/3

strict mode

ECMAScript5에서 소개된 JavaScript의 strict mode는 JavaScript의 제한된 버전을 선택하여 암묵적인 느슨한 모드(sloppy mode)를 해제하기 위한 방법이다.
기존에 무시되던 에러들을 발생시키며, 더 빨리 작동하도록 만들어준다.

strict mode의 특징

(1) 암묵적으로 글로벌 변수를 만드는 것을 차단

x = 10
느슨한 모드에서는 var x = 10으로 동작
------------------------------------
"use strict"
x = 10 // ReferenceError발생

(2) 일반 코드에서 조용히 넘어가는 모든 실패에 대해 예외를 발생시킴

"use strict";

undefined = 5;
NaN = 10;
Infinity = 100;

const obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9;

const obj2 = {
  get x() {
    return 10;
  },
};

const fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai";

//readonly변수(혹은 property), getter only property들의 값을 할당하는 작업, 
확장 불가 객체에 새 property를 할당하는 작업에서 오류를 발생시켜준다.

(3) 삭제할 수 없는 property를 삭제하려할 때 예외 발생

"use strict";

delete Object.prototype;
// TypeError: Cannot delete property

(4) 유니크한 함수 파라미터를 요구

// "use strict";

function sum(a, a, c) {
  console.log(a, c);
  console.log(arguments);
}

sum(1, 2, 3, 4, 5);
// SyntaxError: Duplicate parameter name not allowed in this context
느슨한 모드에서는 중복된 파라미터의 이전 인수들을 숨기지만 arguments에는 남아있음

(5) 숫자 맨 앞의 0이 붙을수 없도록 함

"use strict";

const a = 015;
// SyntaxError: Octal literals are not allowed in strict mode.
느슨한 모드에서는 8진수로 표현되지만, 엄격모드에서 진수를 표현하고 싶은 경우는
0+진수문자 사용(2진수b, 8진수o, 16진수x)

(6) primitive값에 프로퍼티를 설정할 수 없도록 함

"use strict";

const a = 100;
a.c = 10;
// TypeError: Cannot create property

(7) this의 window binding을 할수 없도록 함

(8) arguments객체의 override를 막음

"use strict";

function sum(a, b) {
  a = 100;
  console.log(a + b);
  console.log(arguments[0] + arguments[1]);
}

sum(1, 2);
느슨한 모드에서는 parameter를 변경하면 arguments값도 바뀌어 둘 다
102가 출력되지만, 엄격 모드에서는 arguments의 값은 바뀌지 않기 때문에
102, 3이 출력된다.

(9) block내에서 var는 느슨한 모드와 같은 scope지만, function은 block scope이다.

"use strict"

console.log(ff, f);
{
  f();
  var x = 2;
  function f() {
    console.log("f>", x);
  }
  f();
}

function ff() {
  console.log("ff>", y);
}

위의 상황에서 hoisting시 느슨한 모드에서는 function f가 전역에 undefined로 등록되기 때문에 맨 윗줄 console.log는 ([Function: ff] undefined)를 출력하지만, 엄격 모드에서는 function f는 block scope이기 때문에 console.log에서 ReferenceError가 발생한다.

strict mode 설정 방법

전체 script에 적용하기 위해 구문 작성 전 "use strict"를 삽입한다.

"use strict"

const a = 'Hello';
const b = 'strict mode';
console.log(a + b)

또는 특정 함수에 적용하기 위해 함수 본문 처음에 구문을 삽입해준다.

function strict(){
	"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";
}

위에서 strict함수는 엄격모드지만, notStrict함수는 느슨한 모드이다.

마지막으로 module을 적용하는것이다.
package.json의 type을 module로 주면 자동으로 엄격모드로 변경된다.

package.json
{
	...
    ...
    "type": "module",
    ...
    ...
}

0개의 댓글