avatar
Published on

Javascript use strict

Authors
  • avatar
    Name
    Haneul
    Twitter

자바스크립트 use strict 모드

===========

: strict 모드는 ES5(ECMA Script 5)에 추가된 키워드 strict 모드는 자바스크립트가 묵인했던 에러들의 에러 메시지를 발생시킨다.

  • 선언하지 않고 전역 변수를 만들 수 없다.
"use strict"
temp = 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;
  • get으로 선언된 객체는 수정할 수 없다. (getter-only property 수정 불가능)
"use strict";
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError
  • extensible 특성이 false로 설정된 객체에 속성을 확장 할 수 없다. (확장 불가 객체 확장 불가능)
"use strict";
var testObj = new Object();
Object.preventExtensions(testObj);
testObj.name = "Bob";
  • delete를 호출 할 수 없다.
"use strict";
var temp = 4;
delete temp;
  • 리터럴 객체는 동일한 이름의 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;
  • primitive values의 속성 설정이 불가능.
function() {
"use strict";
false.true = "";         // TypeError
(14).sailing = "home";     // TypeError
"with".you = "far away"; // TypeError
}
  • with를 사용할 수 없다.
  • eval 함수는 주변 스코프에 새로운 변수를 추가하지 않는다.
  • eval을 변수 또는 함수, 매개 변수의 이름으로 사용할 수 없다.
var x = 17;
var evalX = eval("'use strict'; var x = 42; x");
console.log(x);
console.log(evalX);
  • 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]);
  • callee 지원 안 함.
  • 함수 선언은 스크립트나 함수의 최상위에서 해야함.
  • 예약된 키워드의 이름으로 변수 또한 함수를 생성할 수 없다.
  • callee, caller를 통해 stack 검색이 불가능.
function restricted() {
    "use strict";
    restricted.caller;    // throws a TypeError
    restricted.arguments; // throws a TypeError
}
function privilegedInvoker() {
    return restricted();
}
privilegedInvoker();
  • this의 값이 null 또는 undefined인 경우 전역 객체로 변환하지 않는다. (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)());