티스토리 뷰


JS


strict mode



strict 모드는 ES5(ECMA Script 5)에 추가된 키워드입니다.

strict 모드는 자바스크립트가 묵인했던 에러들의 에러 메시지를 발생시킵니다. 엄격하게 문법 검사를 하겠다.. 로 이해하면 될 것 같습니다.



1. strict 모드 선언

스크립트의 시작 혹은 함수의 시작 부분에 "use strict"(또는 'use strict')를 선언하면 strict 모드로 코드를 작성 할 수 있습니다.


스크립트에서 strict 선언

"use strict";
var v = "Hi!  I'm a strict mode script!";


함수에서 strict 선언

function strict(){
  // Function-level strict mode syntax
  '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."; }



2. strict 모드 변화

strict 모드는 문법과 런타임 동작을 모두 검사하여, 실수를 에러로 변환하고, 변수 사용을 단순화(Simplifying) 시켜줍니다.


실수를 에러로 변환(Converting mistakes into errors)

자바스크립트는 오류를 어느정도 무시하고 넘어갈 수 있습니다. 이것이 편하게 코딩을 할 수 있게 하지만, 때로는 심각한 버그를 만들게 됩니다. strict 모드는 이러한 실수를 에러로 변환하여 즉시 수정할 수 있게 합니다.


선언하지 않고 전역 변수를 만들 수 없습니다.

"use strict"
testvar = 4;

선언하지 않고 변수 사용선언하지 않고 변수 사용


writable이 false로, 읽기 전용 객체에 쓰는 것이 불가능 합니다. (read only 객체 수정 불가능)

"use strict";
var testObj = Object.defineProperties({}, {
    prop1: {
        value: 10,
        writable: false // by default
    },
    prop2: {
        get: function () {
        }
    }
});
testObj.prop1 = 20; 
testObj.prop2 = 30;

ready only 객체 수정 불가능ready only 객체 수정 불가능


get으로 선언된 객체는 수정할 수 없습니다. (getter-only property 수정 불가능)

"use strict";
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

getter-only property 수정 불가능getter-only property 수정 불가능


extensible 특성이 false로 설정된 객체에 속성을 확장 할 수 없습니다. (확장 불가 객체 확장 불가능)

"use strict";
var testObj = new Object();

Object.preventExtensions(testObj);

testObj.name = "Bob";

확장 불가 객체 확장 불가능확장 불가 객체 확장 불가능


delete를 호출 할 수 없습니다.

"use strict";
var testvar = 15;
function testFunc() {};
delete testvar;
delete testFunc;

Object.defineProperty(testObj, "testvar", {
    value: 10,
    configurable: false
    });
delete testObj.testvar;

변수, 함수 또는 인수 삭제변수, 함수 또는 인수 삭제


리터럴 객체는 동일한 이름의 property를 가질 수 없습니다.(하지만ES6는 가능함)

"use strict";
var o = { p: 1, p: 2 }; // !!! syntax error


함수의 동일한 매개 변수 이름을 선언하는 것이 불가능 합니다.

"use strict";
function testFunc(param1, param1) {
    return 1;
};

한수에서 동일한 이름의 매개변수 중복 사용한수에서 동일한 이름의 매개변수 중복 사용


8진수 숫자 리터럴 및 이스케이프 문자를 사용 할 수 없습니다.

"use strict";
var testoctal = 010;
var testescape = \010;

8진수 사용, 8진수 값에 이스케이프 사용8진수 사용, 8진수 값에 이스케이프 사용


primitive values의 속성 설정이 불가능합니다.

(function() {
"use strict";

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

})();

primitive values의 속성 설정이 불가능primitive values의 속성 설정이 불가능


strict 모드가 아닌 경우, 에러가 발생하지 않지만, 해당 코드는 무시됩니다.


변수 사용의 명료화(Simplify variable uses)

strict 모드는 변수 이름의 맵핑을 단순화 합니다.

대부분의 컴파일러의 최적화는 변수의 매핑에 달려 있습니다. 자바스크립트 또한 변수의 매핑이 최적화의 크리티컬 이슈입니다. strict 모드를 사용하여 자바스크립트를 최적화 할 수 있습니다.


with를 사용할 수 없습니다.

var foo = {
    name: "foo"
}
with (foo) {
    console.log(name);
}

with를 위와 같이 사용할 수 있습니다. 하지만 with 블록 안에 name은 전역 변수의 name인지 foo의 name인지 모호합니다. 그렇기 때문에 strict 모드에서는 with를 사용하는 것이 불가능합니다.

"use strict";
var x = 17;
with (obj) // !!! syntax error
{
    // If this weren't strict mode, would this be var x, or
    // would it instead be obj.x?  It's impossible in general
    // to say without running the code, so the name can't be
    // optimized.
    x;
}

with를 사용할 수 없습니다.with를 사용할 수 없습니다.


eval 함수는 주변 스코프에 새로운 변수를 추가하지 않습니다.

var x = 17;
var evalX = eval("'use strict'; var x = 42; x");
console.log(x);
console.log(evalX);


eval과 arguments 명료화(Making eval and arguments simpler)

strict 모드는 eval과 arguments 사용을 더욱 명료하게 사용 할 수 있게 합니다.


eval을 변수 또는 함수, 매개 변수의 이름으로 사용할 수 없습니다.

"use strict";
eval = 17;
++eval;
var eval;
function x(eval) { }
var y = function eval() { };

eval을 변수 또는 함수, 매개 변수의 이름으로 사용할 수 없습니다.eval을 변수 또는 함수, 매개 변수의 이름으로 사용할 수 없습니다.


arguments를 변수 또는 함수, 매개 변수의 이름으로 사용할 수 없습니다.

"use strict";
arguments++;
var obj = { set p(arguments) { } };
try { } catch (arguments) { }
function arguments() { }
var f = new Function("arguments", "'use strict'; return 17;");

arguments를 변수 또는 함수, 매개 변수의 이름으로 사용할 수 없습니다.arguments를 변수 또는 함수, 매개 변수의 이름으로 사용할 수 없습니다.


인자값을 수정함으로 arguments의 값이 수정되지 않습니다.

function f(a){
    "use strict";
    a = 42;
    return [a, arguments[0]];
}
var pair = f(17);
console.log(pair[0]);
console.log(pair[1]);

인자값을 수정함으로 arguments의 값이 수정되지 않습니다.인자값을 수정함으로 arguments의 값이 수정되지 않습니다.


callee를 지원하지 않습니다.

"use strict";
var f = function() { return arguments.callee; };
f(); // throws a TypeErrorr

callee를 지원하지 않습니다.callee를 지원하지 않습니다.


안전한 자바스크립트("Securing" JavaScript)

strict 모드를 사용하면 보안에 강한 자바스크립트를 작성할 수 있습니다. 일부 웹 사이트에서 사용자에게 자바스크립트를 작성할 수 있는 기능을 제공합니다. 이 때 사용자가 작성한 자바스크립트는 부분적으로 접근을 금지해야 합니다. 접근을 막기 위하여 런타임에 체크를 한다면 비효율적인 코드가 됩니다. 이러한 문제를 strict 모드를 사용하여 해결 할 수 있습니다.


this의 값이 null 또는 undefined인 경우 전역 객체로 변환하지 않습니다.

"use strict";
function fun() { return this; }
console.log(fun());
console.log(fun.call(2));
console.log(fun.apply(null));
console.log(fun.call(undefined));
console.log(fun.bind(true)());

this의 값이 null 또는 undefined인 경우 전역 객체로 변환하지 않습니다.this의 값이 null 또는 undefined인 경우 전역 객체로 변환하지 않습니다.


this의 결과가 undefined의 경우 window 객체로 변환하지 않고, undefined가 그대로 보이게 됩니다.


callee, caller를 통해 stack 검색이 불가능합니다.

function restricted() { "use strict"; restricted.caller; // throws a TypeError restricted.arguments; // throws a TypeError } function privilegedInvoker() { return restricted(); } privilegedInvoker();

callee, caller를 통한 stack 검색이 불가능합니다.callee, caller를 통한 stack 검색이 불가능합니다.


arguments의 caller를 지원하지 않습니다.

"use strict";
function fun(a, b)
{
  "use strict";
  var v = 12;
  return arguments.caller; // throws a TypeError
}
fun(1, 2); // doesn't expose v (or a or b)

현재 ECMA Script는 arguments.caller를 제공하지 않습니다. 하지만 이전의 버전에서는 arguments.caller를 제공되어 왔습니다. strict 모드 사용시 이전의 ECMA Script에서도 arguments.caller 사용이 불가능합니다.


미래의 자바스트립트 준비(Paving the way for future ECMAScript versions)

strict 모드는 미래의 자바스크립트 버전 도입을 위하여 몇가지 제한 사항을 적용합니다. strict 모드로 몇가지를 제한 하기 때문에, 추후의 자바스크립트 버전에 적용하기 쉽습니다. 즉 향후 업데이트 될 자바스크립트 버전 대응이 용이합니다.


예약된 키워드의 이름으로 변수 또한 함수를 생성할 수 없습니다.

"use strict"
var implements = "";
var interface = "";
var package = "";
var private = "";
var protected = "";
var public = "";
var static = "";
var yield = "";

예약된 키워드를 변수 또한 함수 이름으로 사용예약된 키워드를 변수 또한 함수 이름으로 사용


함수 선언은 스크립트나 함수의 최상위에서 해야 합니다.

"use strict";
if (true){
  function f() { } // !!! syntax error
  f();
}

for (var i = 0; i < 5; i++){
  function f2() { } // !!! syntax error
  f2();
}

function baz(){ // kosher
  function eit() { } // also kosher
}

strict 모드에서 함수는 최상위에서 선언해야 합니다. 이후의 자바스크립트 버전은 최상위에서 선언하지 않은 함수는 다른 의미를 줄 수 있기 때문에, strict 모드에서 최상위에서 함수를 선언하게 함으로 추후에 나올 자바스크립트 버전을 쉽게 대응할 수 있게 합니다.


댓글
댓글쓰기 폼