엄격모드(Strict Mode)

'use strict'는 ECMAScript 5에 처음소개된 지시어이다. 이 지시어를 사용하면 지시어 다음에 오는 코드들이 엄격모드를 따른다. 엄격모드는 언어의 일부기능이 제한된 부분집합으로, 몇가지 중요한 언어적 문제점을 수정하고 강력한 에러 감사와 향상된 보안 기능을 제공한다. 엄격모드의 코드는 표준모드에서 당연히 사용하는하기 때문에 엄격모드를 염두하고 코드를 짜는 습관을 갖는게 좋겠다.

차이점

(몇 가지는 생략)

  • 엄격모드에서는 모든 변수는 반드시 선언되어야 한다. 선언되지 않은 변수나 함수, 함수인자, catch절 인자 전역객체 프로퍼티에 값을 할당할 경우 ReferenceError 예외가 발생한다.
// 표준모드
a = 0

// 엄격모드
"use strict"
a = 0
//Uncaught ReferenceError: a is not defined
  • 엄격모드에서 함수(메서드로 호출된것이 아닌)의 this 값은 undefined이다. 표준모드에서는 항상 전역객체를 this로 넘긴다.)
var hasStrictMode = (function(){"use strict"; return this === undefined}) // true
  • 엄격모드에서는 writable속성이 없는 프로퍼티에 값을 할당하거나, 확장할 수 없는(nonextensible) 객체에 새 프로퍼티를 추가하려고 하면 TypeError 예외가 발생한다. 표준모드에서는 실패하지만 예외는 발생하지 않는다.
// 표준모드
var s = "string"
s.obj = {}
s // undefined

// 엄격모드
"use strict"
var s = "string"
s.obj = {}
s // Uncaught TypeError: Cannot create property 'obj' on string 'string'
  • 엄격모드에서는 delete 연산자 다음에 변수나 함수 또는 함수 전달인자와 같이 부적합한 식별자가 올 경우 SyntaxError 예외가 발생한다. 표준모드는 이런 delete는 아무일도 하지않고 false로 평가한다.
// 표준모드
var o = {x: 1, y: 2}
delete this.o // false

// 엄격모드
"use strict"
var o = {x: 1, y: 2}
delete this.o // Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
// 비슷하지만 약간 다른예
// 표준모드
arr = []
delete arr // true

// 엄격모드 1
"use strict"
arr = []
delete arr // Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.

// 엄격모드 2
"use strict"
this.a = []
delete this.a // true
  • 엄격모드에서 함수의 arguments 객체는 함수에 전달된 값의 정적 사본을 가지고 있다. 하지만 표준모드에서 arguments 배열의 원소와 함수의 전달인자는 동일한 값을 참조한다.
// 표준모드
function change1(x,y) {
  arguments[0] = 2
  return x
}

// 엄격모드
function change2(x,y) {
  "use strict"
  arguments[0] = 2 
  return x
}

var x = y = 1

console.log(change1(x,y))
// 2
console.log(change2(x,y))
// 1
// x와 arguments[0]이 동일한 값을 참조하고 있지 않다.

results matching ""

    No results matching ""