반응형

안녕하세요!


이번에는 javascript 소스에서 심심치 않게 보이는 use strict에 대해서 알아봤어요.

저도 이에 대해서 자세히 알지 못하고 그냥 이렇게 쓰는가보다하고 넘어갔엇어요

그런데 계속 눈에 거슬려서 뭐하는 기능인지 자세히 알아보려고 열심히 찾아봤죠


자바스크립트는 참 코딩하기 좋은 언어라고 생각해요. 

훗날에는 모든언어가 자바스크립트로 바뀐다는 얘기도 들어봤었는데...

짜여진 코드가 치명적인 오류가아니면 자바스크립트에서는 에러 보내지 않고

대부분은 warning이나 넘기는 경우가 많아요.

이러다 보니 초보자 분들에게는 처음부터 잘못 짜여진 코드가 심화되다보니 어디서부터 오류가 발생했는지를 못찾고

결국 산으로가는 상황이.....


이래서 strict 모드를 사용하게 되었나봐요.(100% 제생각)

strict은 엄격한 이라는 뜻이에요

코드를 엄격하게 컴파일 하라는 의미에서 지었나봐요


msndn에서 정의한 내용은 다음과 같습니다.





출처: https://msdn.microsoft.com/ko-kr/library/br230269(v=vs.94).aspx

언어 요소

제한

오류

예제

변수

선언하지 않고 변수를 사용합니다.

SCRIPT5042: Strict 모드에서 변수가 정의되지 않았습니다.

testvar = 4;

읽기 전용 속성

읽기 전용 속성에 씁니다.

SCRIPT5045: Strict 모드에서는 읽기 전용 속성에 할당할 수 없습니다.

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

확장할 수 없는 속성

extensible 특성이false로 설정된 개체에 속성을 추가합니다.

SCRIPT5046: 확장할 수 없는 개체의 속성을 만들 수 없습니다.

var testObj = new Object();

Object.preventExtensions(testObj);

testObj.name = "Bob";

delete

변수, 함수 또는 인수를 삭제합니다.

configurable 특성이 false로 설정된 속성을 삭제합니다.

SCRIPT1045: strict 모드에서는 <식>에 대해 delete를 호출할 수 없습니다.

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

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

속성 중복

개체 리터럴에서 속성을 두 번 이상 정의합니다.

SCRIPT1046: strict 모드에서는 한 속성을 여러 번 정의할 수 없습니다.

var testObj = {
    prop1: 10,
    prop2: 15,
    prop1: 20
};


매개 변수 이름 중복

함수에서 매개 변수 이름을 두 번 이상 사용합니다.

SCRIPT1038: strict 모드에서는 정식 매개 변수 이름이 중복될 수 없습니다.

function testFunc(param1, param1) {
    return 1;
};

다음에 사용하기 위한 예약된 키워드

다음에 사용하기 위한 예약된 키워드를 변수 또는 함수 이름으로 사용합니다.

SCRIPT1050: 식별자에 대해 다음에 사용하기 위한 예약어를 잘못 사용했습니다.strict 모드에서는 식별자 이름이 예약됩니다.

  • implements

  • interface

  • package

  • private

  • protected

  • public

  • static

  • yield

8진수

숫자 리터럴에 8진수 값을 할당하거나 8진수 값에 이스케이프를 사용하려고 합니다.

SCRIPT1039: strict 모드에서는 8진수 숫자 리터럴 및 이스케이프 문자를 사용할 수 없습니다.

var testoctal = 010;
var testescape = \010;

this

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

function testFunc() {
    return this;
}
var testvar = testFunc();

strict 모드가 아닌 경우 testvar 값은 전역 개체이지만 strict 모드에서 이 값은 undefined입니다.

식별자인 eval

문자열 "eval"은 식별자(변수 또는 함수 이름, 매개 변수 이름 등)로 사용할 수 없습니다.

var eval = 10;

문 또는 블록 내에서 선언된 함수

문 또는 블록 내에서 함수를 선언할 수 없습니다.

SCRIPT1047: strict 모드에서는 함수 선언을 문이나 블록 내에 중첩할 수 없습니다.함수 선언은 함수 본문 내에 직접 나오거나 최상위 수준에만 나와야 합니다.

var arr = [1, 2, 3, 4, 5];
var index = null;
for (index in arr) {
    function myFunc() {};
}

eval 함수 내에서 선언된 변수

변수가 eval 함수 내에서 선언되는 경우 해당 함수 밖에서 사용할 수 없습니다.

SCRIPT1041: strict 모드에서 'eval'을 잘못 사용했습니다.

eval("var testvar = 10");
testvar = 15;

간접 계산이 가능하지만 eval 함수 외부에 선언된 변수는 여전히 사용할 수 없습니다.

var indirectEval = eval;
indirectEval("var testvar = 10;");
document.write(testVar);

이 코드는 "SCRIPT5009: 'testVar'이 정의되지 않았습니다" 오류를 발생시킵니다.

식별자인Arguments

문자열 "arguments"는 식별자(변수 또는 함수 이름, 매개 변수 이름 등)로 사용할 수 없습니다.

SCRIPT1042: strict 모드에서 'arguments'를 잘못 사용했습니다.

var arguments = 10;

함수 내arguments

로컬 arguments개체의 멤버 값을 변경할 수 없습니다.

function testArgs(oneArg) {
    arguments[0] = 20;
}

strict 모드가 아닌 경우 arguments[0] 값을 변경하여 oneArg 매개 변수의 값을 변경할 수 있습니다. 그러면 oneArg 및arguments[0]의 값이 모두 20이 됩니다.strict 모드에서arguments[0] 값을 변경해도 oneArg 값에 영향을 주지 않습니다. arguments 개체가 로컬 복사본이기 때문입니다.

arguments.callee

허용되지 않습니다.

function (testInt) {
    if (testInt-- == 0)
        return;
    arguments.callee(testInt--);
}

WITH

허용되지 않습니다.

SCRIPT1037: strict 모드에서는 'with' 문을 사용할 수 없습니다.

with (Math){
    x = cos(3);
    y = tan(7);
}


선언은 전역에서 하게되면 전체 범위에 미치고

함수 내에서 사용하면 함수 내에서만 범위가 됩니다.



자바스크립트는 참 재밌고 코딩하고싶은 언어라고 생각이 드네요.

그럼 즐거운 코딩 하시기 바랍니다 ^0^










반응형

'JAVASCRIPT' 카테고리의 다른 글

네이버 스마트에디터 사용하기  (0) 2017.01.16
Jquery ajxa 사용법  (0) 2016.05.18
javascript 이미지 확대 팝업 창  (2) 2015.10.29
jquery 동적 이벤트 추가!  (0) 2015.05.20
jquery empty()와 detach() 비교  (0) 2015.04.27

+ Recent posts