이 글은 지난 this와 바인딩?에서 다른 내용들이 많아 추출하여 쓴 글이다.
엄격모드는 ECMAScript 5에서 소개된 JavaScript의 엄격모드라고 한다. 엄격모드를 지원하지 않는 브라우저에서는 엄격모드의 코드가 다른 방식으로 동작할 것이라고 한다. 그렇기 때문에 사용에 주의해야 한다고 한다.
엄격모드는 평범한 JavaScript 시멘틱스(기능들?)에 몇 가지 변경이 일어난다고 한다. 몇가지 정리해 보자.
조용히 무시되던 에러들이 throwing 한다고 한다.
엄격모드는 전체스크립트 또는 부분 함수에 적용이 가능하다고 한다. 단, {}
중괄호로 묶여진 블럭문에는 적용되지 않는다고 한다.
다음은 엄격 모드 적용의 한 예이다.
//use strict mode
'use strict';
var v = "Hi! I'm a strict mode script!";
// 이 구문이 유명하다고하는 이유는 모르겠다 ㅠㅠ. 다만 다음과 같은 전역객체에 제한이 되었다.
console.log(this.v) //undefined
//use sloppy mode?
var v = "Hi! I'm a strict mode script!";
console.log(this.v) //"Hi! I'm a strict mode script!"
엄격모드 시 적용되는 것들이 많지만 중요하다고 생각하는 몇 가지만 짚고 넘어가자.
'use strict';
a = 1; //ReferenceError: a is not defined
undefined
, NaN
와 같은 프로퍼티(?)를 변수를 선언할 때도 에러가 발생한다고 하는데, ES6부터는 에러가 아니라고 하는데 정확하지는 않다.(bug 1041128이라고...)
유니크한 파라미터 이름을 요구한다고 한다. 일반 코드에서는 마지막으로 중복된 인수가 이전에 지정된 인수를 숨긴다고 한다. 사실 arguments[i]
를 통해서 접근할 수 있다고 하는데 이건 나중에 다룰수 있으면 다루도록 하겠다. ㅠ
function aa(c,c,d){
return c + d
}
aa(1,2,3) //5
//use strict mode
function aa(c,c,d){
'use strict' // SyntaxError: Argument name clash.
return c + d
}
this
로 함수에 전달된 값은 강제로 객체가 되지 않는다고 한다.function fun(){
return this
}
fun() === this // true
//use strict mode
'use strict'
function fun(){
return this
}
console.log(fun()) //undefined
[Strict mode, MDN, 2022년06월17일 접속]
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Strict_mode