JavaScript에서 "엄격한 사용"은 무엇을하며 그 이유는 무엇입니까?


7547

최근에 Crockford의 JSLint를 통해 일부 JavaScript 코드를 실행 했으며 다음 오류가 발생했습니다.

1 행의 문제점 문자 1 : "엄격한 사용"명령문이 누락되었습니다.

일부 검색을 수행하면 일부 사람들 "use strict";이 JavaScript 코드에 추가한다는 것을 깨달았습니다 . 문을 추가하면 오류가 더 이상 나타나지 않습니다. 불행히도 구글은이 문자열 진술의 역사를 많이 밝히지 않았다. 확실히 브라우저가 JavaScript를 해석하는 방법과 관련이 있어야하지만 그 효과가 무엇인지 모르겠습니다.

그렇다면 무엇을 "use strict";의미하고 무엇을 의미하며 여전히 관련이 있습니까?

현재 브라우저 중 하나가 "use strict";문자열에 응답 합니까 아니면 나중에 사용할 수 있습니까?


5
여기의 답변은 오래되었지만 잘못되었습니다. 엄격 모드의 주요 이유는 오류를 프로그래밍을 방지하기 위해 아니었다 - 그것은 정적 analysable 될 수 있도록 자바 스크립트 어휘 범위 만드는 것이었다 :]
벤자민 Gruenbaum

@BenjaminGruenbaum "use strict";단독으로 사용한다고 해서 JS의 어휘 범위가 결정되지는 않습니다. 로 변수를 선언 let하고 const너무 사용해야합니다.
Koorosh Pasokhi

블록 범위 지정과 어휘 범위를 혼합하고 있습니다.
Benjamin Gruenbaum

답변:


4937

Javascript Strict Mode에 대한이 기사는 다음과 같습니다. John Resig-ECMAScript 5 Strict Mode, JSON 등

흥미로운 부분을 인용하려면 :

엄격 모드는 ECMAScript 5의 새로운 기능으로 "엄격한"운영 컨텍스트에 프로그램 또는 기능을 배치 할 수 있습니다. 이 엄격한 컨텍스트는 특정 조치가 수행되지 않도록하고 더 많은 예외를 발생시킵니다.

과:

엄격한 모드는 몇 가지 방법으로 도움이됩니다.

  • 일반적인 코딩 블로커를 잡아 예외를 던집니다.
  • 상대적으로 "안전하지 않은"조치가 수행 될 때 (예 : 글로벌 오브젝트에 대한 액세스 권한 확보) 오류를 방지하거나 발생시킵니다.
  • 혼란 스럽거나 잘못 생각한 기능을 비활성화합니다.

또한 전체 파일에 "엄격 모드"를 적용 할 수 있습니다 ... 또는 특정 기능 (여전히 John Resig의 기사에서 인용) 에만 사용할 수 있습니다 .

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code... 

이전 코드와 새 코드를 혼합 해야하는 경우 도움이 될 수 있습니다. ;-)

그래서 나는 그것이 "use strict"Perl에서 사용할 수있는 것과 약간 비슷하다고 생각합니다 (따라서 이름은 무엇입니까?) .

엄격한 모드는 이제 모든 주요 브라우저에서 지원됩니다 .

내부 네이티브 인 ECMAScript 모듈 (과 importexport문)와 ES6 클래스 , 엄격 모드는 항상 활성화 및 비활성화 할 수 없습니다.


100
몇 년 후 기본값을 변경? 너무 늦었습니다. 기존 사이트 / 스크립트 / 응용 프로그램이 너무 많을 것입니다 ... 가능한 유일한 것은 미래를 위해 더 나은 것을 만드는 것입니다.
Pascal MARTIN

14
"use strict"Firefox 3.6, Safari 5, Chrome 7 및 Opera 10.6 (모든 Mac)에서 사용할 때 유효하지 않은 작은 코드 스 니펫을 시도했습니다 . 어떤 오류도 없으므로 '엄격한 사용'은 아직 모든 브라우저에서 지원되지 않는 것 같습니다. IE9에서 테스트하지는 않았지만;)
Husky

11
빠른 업데이트 : Firefox 4는 엄격 모드를 완벽하게 지원하며 다른 브라우저는 지원하지 않습니다. Safari와 Chrome은 "부분"을 지원하지만 그게 무슨 뜻인지 잘 모르겠습니다.
Sasha Chedygov

29
크롬 11은 IE10처럼이 모든 테스트를 통과 할 것으로 보인다 ie.microsoft.com/testdrive/HTML5/TryStrict/Default.html#
G 맨

12
@Julius-예약 된 키워드를 사용하여 구현할 수 없었습니다. 엄격 모드를 트리거하는 코드는 이전 브라우저에서 작동하지 않기 때문입니다. "무작위"문자열 리터럴을 추가해도 아무런 문제가 없습니다.
nnnnnn

1245

ECMAScript 5의 새로운 기능입니다. John Resig는 이에 대한 훌륭한 요약 을 작성했습니다.

JavaScript 파일 (파일 상단 또는 함수 내부)에 넣은 문자열입니다.

"use strict";

코드에 넣는 것은 문자열 일뿐이므로 현재 브라우저에서 문제를 일으키지 않아야합니다. 코드가 pragma를 위반하면 나중에 코드에 문제가 발생할 수 있습니다. 예를 들어, 현재 foo = "bar"정의하지 않고 있다면 foo코드가 실패하기 시작합니다. 제 생각에는 좋은 것입니다.


328
빨리 실패하고 큰 소리로 실패합니다.
Niels Bom

31
HTML 파일로 자바 스크립트를 인라인으로 작성하는 경우로 각각의 새 블록을 시작하십시오 <script>"use strict";. 플래그는 포함 된 블록에만 적용됩니다.
nobar

7
재밌 네요. 결과적으로 문자열에 작은 따옴표가 있어야합니다. 그래서 쓰기 'use strict';대신에
nilsi

1
그렇다면 자바 스크립트의 게양 개념은 어떻게 될까요?
Sunil Sharma

1
@SunilSharma 호이스트를 시도하지만 변수가 정의되지 않아 실패하면 전역 객체에 추가됩니다. 를 사용 "use strict";하면 대신 실패합니다. 전역 객체에 추가하는 경우 다음에 함수를 실행할 때 작동하지 않을 수 있음을 의미하므로 가장 높은 블록 (전역)에있는 것처럼 블록을 재설정하는 다른 작업을 수행하기 때문에 더 의미가 있습니다.
wizzwizz4

646

이 명령문 "use strict";은 브라우저가 엄격하고 안전한 JavaScript 기능 세트 인 엄격 모드를 사용하도록 지시합니다.

기능 목록 (완전하지 않음)

  1. 전역 변수를 허용하지 않습니다. ( var변수 이름에 누락 된 선언 및 오타가 있음)

  2. 자동 실패 할당은 엄격 모드 (할당 NaN = 5;) 에서 오류를 발생시킵니다.

  3. 삭제 불가능한 속성을 삭제하려고하면 ( delete Object.prototype)

  4. 객체 리터럴의 모든 속성 이름은 고유해야합니다 ( var x = {x1: "1", x1: "2"}).

  5. 함수 매개 변수 이름은 고유해야합니다 ( function sum (x, x) {...})

  6. 8 진수 구문을 금지합니다 ( var x = 023;일부 개발자는 앞의 0이 숫자를 변경하는 데 아무 것도 없다고 잘못 가정합니다.)

  7. with키워드를 금지합니다

  8. eval 엄격 모드에서는 새로운 변수를 도입하지 않습니다

  9. 일반 이름 삭제 금지 ( delete x;)

  10. 할당 이름의 또는 바인딩을 금지 eval하고 arguments어떤 형태

  11. 엄격 모드는 arguments공식 매개 변수 를 사용하여 오브젝트의 특성에 별명을 지정하지 않습니다 . (즉, function sum (a,b) { return arguments[0] + b;}이것은 arguments[0]묶여 있기 때문에 작동 a합니다.)

  12. arguments.callee 지원되지 않습니다

[참고 : 엄격 모드 , Mozilla 개발자 네트워크 ]


40
Nit : 전역 변수가 허용되며 명시 적이어야합니다 (예 :) window.foo = bar.
gcampbell

1
객체 리터럴의 모든 속성 이름이 고유해야합니다 (var x = {x1 : "1", x1 : "2"}). 이것은 유효합니다
Arun Killu

4
11의 예에서 a의 수정이 누락되었습니다 (그렇지 않으면 의미가 없습니다). 나. 함수 합 (a, b) {a = 0; 반환 인수 [0] + b; } alert (sum (1, 2))는 앨리어싱으로 인해 엄격 모드에서는 3을, 엄격 모드에서는 2를 반환합니다.
David Gausmann

413

사람들이 사용에 대해 걱정한다면 use strict이 기사를 확인하는 것이 좋습니다.

브라우저에서 ECMAScript 5 '엄격한 모드'지원. 이것은 무엇을 의미 하는가?
NovoGeek.com-Krishna의 웹 로그

브라우저 지원에 대해 이야기하지만 더 중요하게는 브라우저를 안전하게 처리하는 방법에 대해 설명합니다.

function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/

116
동의하지 않습니다. 이것이 왜 이것이 매우 유용한 지 보여줍니다. 본질적으로 이것은 이것이 기능이 아닌 기능을 반환한다는 것을 의미합니다.window
Jamie Hutber

36
언제 this타겟팅 할 수없는 창을 원 window하십니까?
Jamie Hutber

14
그것은 그 자체를 말합니다. this
Jamie Hutber

26
두 번째 this것은 실제로 undefined입니다.
Broxzier

14
요점은 전역 객체에서 자동으로 잘못된 일을하는 대신 정의되지 않은 속성에 액세스하여 JS 프로그램이 실패하기 시작한다는 것입니다. 미묘한 버그를 훨씬 쉽게 추적 할 수 있습니다.
Stephen Chung

208

주의해야 할 것은 하드 충전 프로그래머 모두입니다. "use strict"기존 코드에 적용 하면 위험 할 수 있습니다! 이 것은 기분이 좋고 행복한 얼굴 스티커가 아니므로 코드를 더 잘 찍을 수 있습니다. 로 "use strict"프라 그마, 브라우저가 갑자기 기본 / 느슨한 자바 스크립트를 행복하게 수 있다는 그 자리에 당신이 뭔가를하고있는 이유만으로 그 전에 던졌다 결코 임의의 장소에서 예외가 있지만, 엄격한 자바 스크립트 혐오가 발생합니다! 엄격하게 위반하면 코드에서 거의 사용되지 않는 호출에 숨겨져있어 결국 유료 고객이 사용하는 프로덕션 환경에서 예외가 발생할 수 있습니다.

급락을하려는 경우 "use strict"포괄적 인 단위 테스트와 엄격하게 구성된 JSHint 빌드 작업을 함께 적용 하여 모듈의 어두운 구석이 없다는 사실을 확신 할 수 있습니다. 엄격 모드를 켰습니다. 또는 다른 옵션 "use strict"이 있습니다. 레거시 코드에 추가하지 마십시오 . 정직하게 더 안전 할 것입니다. 타사 모듈과 같이 소유하거나 유지 관리하지 않는 모듈에는 추가 하지 마십시오"use strict" .

나는 그것이 갇힌 동물 "use strict"이지만 좋은 물건이 될 수 있다고 생각하지만 , 당신은 올바르게해야합니다. 엄격하게 가기 가장 좋은시기는 프로젝트가 그린 필드이고 처음부터 시작할 때입니다. 구성 JSHint/JSLint의 모든 경고 및 옵션은 당신의 팀이, 위 같은 금일 조작 된 좋은 빌드 / 테스트 / 어설 션 시스템을 얻을 수있는 꽉으로 최대 마약 Grunt+Karma+Chai, 오직 그때 모든 새 모듈을 표시 시작합니다 "use strict". 많은 오류와 경고를 치료할 수 있도록 준비하십시오. JSHint/JSLint위반이 발생할 경우 빌드를 FAIL로 구성하여 모든 사람이 중력을 이해하도록하십시오 .

내가 채택했을 때 내 프로젝트는 그린 필드 프로젝트가 아니었다 "use strict". 결과적으로 "use strict"모듈의 절반 이 없기 때문에 IDE에 빨간색 표시가 생겨 JSHint가 이에 대해 불평합니다. 앞으로 리팩토링을 어떻게해야하는지 상기시켜줍니다. 나의 목표는 모든 누락 된 "use strict"진술 로 인해 빨간색 표시가없는 것이지만 지금은 몇 년이 지났습니다.


24
왜이 스레드의 개발자들이 "엄격한 사용"에 대해 무심한가 ?? 선을 위해서 자바 스크립트 에서 예외를 던진다 ! 콘플레이크의 설탕처럼 코드에 뿌려주세요 아니! 나쁜! "엄격한 사용"은 모든 주요 브라우저에 대해 통과하고 모든 코드 경로를 실행하는 단위 테스트가있는 제어 코드에서만 신중하게 사용해야합니다. 시험 받았어? "엄격한 사용"은 괜찮습니다.
DWoldrich

57
예. 분명히 "엄격한 사용"은 이전에 깨지지 않은 것처럼 보이는 유효한 자바 스크립트를 깨뜨릴 수 있습니다. 그러나 이전에 깨지지 않은 코드는 코드가 정확하고 예상대로 수행하는 것과 같지 않습니다. 일반적으로 선언되지 않은 변수를 참조하는 것은 오타 등을 나타냅니다. 엄격 사용을 사용하면 이러한 종류의 오류를 포착 할 수 있으며 생산 코드를 배송하기 전에 희망을 가질 수 있습니다.
Jostein Kjønigsen

5
... 아니면 그냥 모든 명백한 문제, 어깨를 으쓱를 수정, 코드를 통해 마지막 패스의 일환으로 "엄격한 사용"적용 "충분"다음 :) 생산을 꺼내라고
늑대 견

13
개인적으로, 나는 결코 기존 코드에 거의 추가 하지 않습니다 "use strict";. 즉, 처음부터 새 코드를 작성할 때 거의 항상 사용합니다
Martin

3
이미 JSLint를 사용하고 있다면 "엄격한 사용"으로 인해 문제가 발생하는 대부분의 장소를 수정했을 것입니다.
Jonathan Cast

179

을 사용해도 'use strict';코드가 갑자기 나아지는 것은 아닙니다.

자바 스크립트 엄격 모드는 기능입니다 인 ECMAScript 5 . 스크립트 / 함수 맨 위에 이것을 선언하여 엄격 모드를 활성화 할 수 있습니다.

'use strict';

JavaScript 엔진이이 지시문을 보면 특수 모드에서 코드를 해석하기 시작합니다. 이 모드에서는 잠재적 인 버그가 될 수있는 특정 코딩 방법이 감지 될 때 오류가 발생합니다 (엄격 모드의 원인).

이 예제를 고려하십시오.

var a = 365;
var b = 030;

숫자 리터럴을 정렬하는 것에 대한 집착으로 개발자는 실수로 변수 b를 8 진 리터럴 로 초기화했습니다 . 엄격하지 않은 모드는이 값을 2410을 기준 으로 값이있는 숫자 리터럴로 해석합니다 . 그러나 엄격 모드에서는 오류가 발생합니다.

엄격 모드의 비전문가 목록은 이 답변을 참조하십시오 .


어디에서 사용해야 'use strict';합니까?

  • 내에서 새로운 자바 스크립트 응용 프로그램 : 물론! 엄격한 모드는 코드로 바보 같은 일을 할 때 내부 고발자로서 사용될 수 있습니다.

  • 내에서 기존의 자바 스크립트 코드 : 아마 아닙니다! 기존 JavaScript 코드에 엄격 모드에서 금지 된 명령문이있는 경우 애플리케이션이 중단됩니다. 엄격 모드를 원하면 기존 코드를 디버그하고 수정할 준비가되어 있어야합니다. 이것이 사용 'use strict';이 갑자기 코드를 향상시키지 않는 이유 입니다.


엄격 모드는 어떻게 사용합니까?

  1. 'use strict';스크립트 위에 문장을 삽입하십시오 .

    // File: myscript.js
    
    'use strict';
    var a = 2;
    ....

    파일의 모든 내용 myscript.js은 엄격 모드로 해석됩니다.

  2. 또는 'use strict';함수 본문 위에 명령문을 삽입 하십시오.

    function doSomething() {
        'use strict';
        ...
    }

    어휘 기능 범위 의 모든 내용은 doSomething엄격 모드에서 해석됩니다. 어휘 범위 라는 단어 가 여기서 중요합니다. 예를 들어, 엄격한 코드가 엄격 하지 않은 라이브러리의 함수를 호출하면 코드 만 호출 된 함수가 아닌 엄격 모드로 실행됩니다. 자세한 설명 은 이 답변 을 참조하십시오 .


엄격 모드에서 금지 된 사항은 무엇입니까?

엄격한 모드에서 금지 된 몇 가지 사항을 설명 하는 멋진 기사 를 찾았습니다 (이 목록은 독점 목록이 아닙니다).

범위

역사적으로 JavaScript는 함수의 범위를 지정하는 방법에 대해 혼란 스러웠습니다. 때로는 정적으로 범위가 지정된 것처럼 보이지만 일부 기능은 동적으로 범위가 지정된 것처럼 동작합니다. 혼란 스럽기 때문에 프로그램을 읽고 이해하기가 어렵습니다. 오해로 인해 버그가 발생합니다. 성능 문제이기도합니다. 정적 범위 지정은 컴파일 타임에 변수 바인딩이 발생하도록 허용하지만 동적 범위에 대한 요구 사항은 바인딩이 런타임으로 지연되어야한다는 것을 의미하며 이는 상당한 성능 저하가 따릅니다.

엄격 모드에서는 모든 변수 바인딩을 정적으로 수행해야합니다. 즉, 이전에 동적 바인딩이 필요한 기능을 제거하거나 수정해야합니다. 특히 with 문이 제거되고 호출자의 환경을 변경하는 eval 함수의 기능이 심각하게 제한됩니다.

엄격한 코드의 장점 중 하나는 YUI Compressor 와 같은 도구 가 처리 할 때 더 나은 작업을 수행 할 수 있다는 것입니다.

내재 된 글로벌 변수

JavaScript는 전역 변수를 암시했습니다. 변수를 명시 적으로 선언하지 않으면 전역 변수가 암시 적으로 선언됩니다. 이를 통해 초보자는 기본 하우스 키핑 작업을 무시할 수 있으므로 프로그래밍이 쉬워집니다. 그러나 큰 프로그램을 관리하기가 훨씬 어려워지고 안정성이 크게 저하됩니다. 따라서 엄격 모드에서는 내재 된 전역 변수가 더 이상 생성되지 않습니다. 모든 변수를 명시 적으로 선언해야합니다.

글로벌 누출

this 전역 객체에 바인딩 될 수있는 여러 상황이 있습니다 . 예를 들어 new생성자 함수를 호출 할 때 접두사 를 제공하지 않으면 생성자가 this전역 객체에 예기치 않게 바인딩되므로 새 객체를 초기화하는 대신 전역 변수가 자동으로 변경됩니다. 이러한 상황에서는 엄격 모드가 대신에 바인딩 this되어 undefined생성자가 대신 예외를 throw하여 오류를 훨씬 빨리 감지 할 수 있습니다.

시끄러운 실패

JavaScript에는 항상 읽기 전용 속성이 있었지만 ES5의 Object.createProperty 기능이 해당 기능을 노출 할 때까지 직접 만들 수 없었습니다 . 읽기 전용 속성에 값을 할당하려고하면 자동으로 실패합니다. 할당은 속성 값을 변경하지 않지만 프로그램은 마치 그대로 진행됩니다. 이는 프로그램이 일관성이없는 상태가 될 수있는 무결성 위험입니다. 엄격 모드에서는 읽기 전용 속성을 변경하려고하면 예외가 발생합니다.

옥탈

숫자의 8 진법 (또는 8 진법)은 단어 크기가 3의 배수 인 기계에서 기계 수준 프로그래밍을 수행 할 때 매우 유용했습니다. 단어 크기가 60 비트 인 CDC 6600 메인 프레임으로 작업 할 때는 8 진법이 필요했습니다. 8 진수를 읽을 수 있다면 단어를 20 자리로 볼 수 있습니다. 2 자리 숫자는 op 코드를 나타내고 1 자리 숫자는 8 개의 레지스터 중 하나를 나타냅니다. 기계어 코드에서 고급 언어로 느리게 전환하는 동안 프로그래밍 언어로 8 진 형식을 제공하는 것이 유용한 것으로 생각되었습니다.

C에서는 매우 불행한 8 진 표현이 선택되었습니다 : 선행 0. 따라서 C에서는 0100100이 아니라 64를 의미하며 088이 아닌 오류입니다. 더 불행하게도,이 구식은 오류를 만드는 데만 사용되는 JavaScript를 포함한 거의 모든 현대 언어로 복사되었습니다. 다른 목적은 없습니다. 따라서 엄격 모드에서는 8 진 형식이 더 이상 허용되지 않습니다.

등등

인수 의사 배열은 ES5에서 조금 더 배열과 비슷해집니다. 엄격 모드에서는 해당 속성 calleecaller속성 이 손실 됩니다. 이를 통해 arguments많은 기밀 컨텍스트를 포기하지 않고 신뢰할 수없는 코드 로 전달할 수 있습니다 . 또한 arguments기능 의 속성이 제거됩니다.

엄격 모드에서 함수 리터럴의 중복 키는 구문 오류를 생성합니다. 함수는 같은 이름을 가진 두 개의 매개 변수를 가질 수 없습니다. 함수는 매개 변수 중 하나와 이름이 같은 변수를 가질 수 없습니다. 함수는 delete자체 변수를 가질 수 없습니다 . delete구성 할 수없는 속성을 시도 하면 예외가 발생합니다. 기본 값은 암시 적으로 랩핑되지 않습니다.


향후 JavaScript 버전을위한 예약어

ECMAScript 5는 예약어 목록을 추가합니다. 변수 또는 인수로 사용하면 엄격 모드에서 오류가 발생합니다. 예약어는 다음과 같습니다.

implements, interface, let, package, private, protected, public, static, 및yield


추가 자료


2
아주 좋은 설명입니다. 그러나 Angular js와 같은 다른 Java 스크립트 라이브러리와 함께 "엄격한"모드를 사용할 수 있는지 의심 스럽습니다.
UVM

3
@UVM : 엄격 모드 지시문은 어휘 범위에만 영향을줍니다. 즉, 선언 된 파일 / 함수 만 'use strict'지시문 이없는 다른 파일 / 함수 가 있으면 엄격 모드에서 실행중인 함수에서 호출 될 때에도 엄격하지 않은 모드로 실행됩니다. 설명 은 이 asnwer 를 참조하십시오 .
sampathsris

이것은 완전히 정확하지 않습니다. '엄격한 사용'은 코드 실행 방식을 변경합니다.
CyberEd

3
두 번째로 보면 맞습니다. 나는 당신이 예외를 던졌다는 것을 의미한다고 생각했지만 코드가 변경되는 것처럼 코드가 작동하는 방식을 바꾸지 않았다 this. 이제 다른 함수 호출을 참조하고 있습니다.
CyberEd

3
8 진수가 유용한 경우가 있습니다. C 구문은 끔찍하지만 언어에 새로운 8 진 구문이 추가되어 0이 아닌 형식이 더 이상 사용되지 않는 것을 보길 원했습니다. 물론 Javascript가 선행 0 형식을 지원하는 것은 어리석은 일이었습니다.
supercat

138

모든 개발자가 지금 엄격 모드를 사용하는 것이 좋습니다. 엄격한 모드는 코드에서 알지 못했던 오류로부터 합법적으로 우리를 구할 수 있도록 충분한 브라우저를 지원합니다.

분명히, 초기 단계에서 우리가 전에는 본 적이없는 오류가있을 것입니다. 모든 이점을 얻으려면 엄격한 모드로 전환 한 후 모든 것을 포착했는지 확인하기 위해 적절한 테스트를 수행해야합니다. 확실히 우리는 단지 use strict코드를 던지지 않고 오류가 없다고 가정합니다. 따라서 더 좋은 코드를 작성하기 위해이 매우 유용한 언어 기능을 사용하기 시작해야합니다.

예를 들어

var person = {
    name : 'xyz',
    position : 'abc',
    fullname : function () {  "use strict"; return this.name; }
};

JSLint 는 Douglas Crockford가 작성한 디버거입니다. 스크립트에 붙여 넣기 만하면 코드에서 눈에 띄는 문제와 오류가 있는지 신속하게 스캔합니다.


6
@JamieHutber :이 링크 caniuse.com/use-strict AND kangax.github.io/es5-compat-table을 방문하십시오 . 모든 브라우저에 대해 정확한 아이디어를 제공합니다.
Pank

95

다른 답변을 보완하는 다소 더 설립 된 답변을 제공하고 싶습니다. 가장 인기있는 답변을 수정하고 싶었지만 실패했습니다. 나는 그것을 가능한 한 포괄적이고 완전하게 만들려고 노력했다.

MDN 설명서를 참조 할 수 있습니다자세한 내용 를 참조하십시오.

"use strict" ECMAScript 5에 도입 된 지침.

지시문은 문장과 비슷하지만 다릅니다.

  • use strict키워드를 포함하지 않음 : 지시문은 간단한 표현식 문으로, 특수 문자열 리터럴 (작은 따옴표 나 큰 따옴표)로 구성됩니다. ECMAScript 5를 구현하지 않는 JavaScript 엔진은 부작용없이 표현식 문만 보게됩니다. 향후 버전의 ECMAScript 표준 use은 실제 키워드로 도입 될 것으로 예상 됩니다. 따라서 인용문은 더 이상 사용되지 않습니다.
  • use strict스크립트 나 함수의 시작 부분에서만 사용할 수 있습니다. 즉, 다른 모든 실제 문장보다 앞에 와야합니다. 함수 스크립트에서 첫 번째 명령 일 필요는 없습니다. 문자열 리터럴로 구성된 다른 명령문 표현식이 앞에 올 수 있습니다 (JavaScript 구현에서는이를 구현 특정 지시문으로 취급 할 수 있음). 스크립트 또는 함수에서 첫 번째 실제 명령문 뒤에 오는 문자열 리터럴 명령문은 간단한 표현식 명령문입니다. 통역사는 지시어로 해석해서는 안되며 아무런 영향을 미치지 않습니다.

use strict지시어 (스크립트 또는 함수에서) 다음 코드는 엄격한 코드를 나타냅니다. 스크립트에 use strict지시문이 포함 된 경우 최상위 수준의 스크립트 코드 (함수에없는 코드)는 엄격한 코드로 간주됩니다 . 함수 자체가 엄격한 코드로 정의되거나 함수에 use strict지시문이 포함 된 경우 함수의 내용은 엄격한 코드로 간주됩니다 . eval()메소드에 전달 된 코드는 엄격한 코드 eval()에서 호출되거나 다음을 포함하는 경우 엄격한 코드로 간주됩니다 .use strict 지시문 자체를 됩니다.

ECMAScript 5의 엄격한 모드는 JavaScript 언어의 제한된 하위 집합으로, 언어의 관련 결함을 제거하고보다 엄격한 오류 검사 및 높은 보안 기능을 제공합니다. 다음은 엄격 모드와 일반 모드의 차이점을 나열합니다 (처음 세 가지가 특히 중요 함).

  • 사용할 수 없습니다 with엄격 모드 -statement를 .
  • 엄격 모드에서는 모든 변수를 선언해야합니다. 변수, 함수, 함수 매개 변수, catch-clause 매개 변수 또는 global 속성으로 선언되지 않은 식별자에 값을 할당 Object하면을 얻게 ReferenceError됩니다. 일반 모드에서 식별자는 전역 변수 (전역의 속성으로)로 암시 적으로 선언됩니다.Object )
  • 엄격 모드에서 키워드 this에는 undefined함수가 아닌 함수로 호출 된 함수 의 값 이 있습니다. (일반 모드에서는 this항상 전역을 가리 킵니다 Object). 이 차이는 구현이 엄격 모드를 지원하는지 테스트하는 데 사용할 수 있습니다.
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • 또한 함수가 엄격 모드에서 호출 call()되거나 apply엄격 모드에서 호출 this되면 call()또는 apply()호출 의 첫 번째 인수의 값입니다 . (일반 모드 nullundefined글로벌로 대체 Object하지 객체 인 객체로 캐스팅되는, 및 값).

  • 엄격한 모드에서는 TypeError 읽기 전용 속성을 할당하거나 확장 할 수없는 객체에 대한 새 속성을 정의하려고 할 때가 나타납니다. (정상 모드에서는 모두 오류 메시지없이 실패합니다.)

  • 엄격 모드에서는 코드를에 전달할 때 eval()호출자의 범위에서 변수 또는 함수를 선언하거나 정의 할 수 없습니다 (일반 모드에서와 같이). 대신, 새로운 범위가 작성 eval()되고 변수 및 기능이 해당 범위 내에 있습니다. 해당 범위는 eval()실행이 완료되면 소멸 됩니다.
  • 엄격 모드에서 함수의 arguments-object에는 해당 함수에 전달되는 값의 정적 사본이 포함됩니다. 일반 모드에서 arguments-object는 다소 "마법적인"동작을 갖습니다. 배열의 요소와 명명 된 함수 매개 변수는 모두 동일한 값을 참조합니다.
  • 엄격 모드에서는 연산자 뒤에 규정되지 않은 식별자 (변수, 함수 또는 함수 매개 변수) 가 올 SyntaxError때가 나타납니다 delete. 일반 모드에서는 delete표현식이 아무 작업도 수행하지 않고로 평가됩니다 false.
  • 엄격 모드에서는 TypeError구성 할 수없는 속성을 삭제하려고 할 때가 나타납니다. 일반 모드에서는 시도가 실패하고 delete표현식이로 평가됩니다 false.
  • 엄격 모드에서는 객체 리터럴에 대해 동일한 이름으로 여러 속성을 정의하려고 할 때 구문 오류로 간주됩니다. (일반 모드에서는 오류가 없습니다.)
  • 엄격 모드에서는 함수 선언에 이름이 같은 여러 개의 매개 변수가있는 경우 구문 오류로 간주됩니다. (일반 모드에서는 오류가 없습니다.)
  • 엄격 모드에서는 8 진 리터럴이 허용되지 않습니다 (이것은로 시작하는 리터럴입니다) 0x . 일반 모드에서는 8 진 리터럴을 허용하는 구현이 있습니다.)
  • 엄격 모드에서는 식별자 evalarguments키워드처럼 취급됩니다. 값을 변경하거나 값을 지정할 수 없으며 변수, 함수, 함수 매개 변수 또는 catch 블록의 식별자 이름으로 사용할 수 없습니다.
  • 엄격 모드에서는 호출 스택을 검사 할 가능성에 대한 추가 제한 사항이 있습니다. arguments.callerarguments.callee의 원인이 TypeError엄격 모드에서 함수에. 또한 엄격 모드에서 함수의 일부 호출자 및 인수 속성은 함수 TypeError를 읽으려고 할 때 발생 합니다.

4
"엄격 모드에서 8 진 리터럴은 허용되지 않습니다 (이것은 0x로 시작하는 리터럴입니다)"8 진 리터럴은 선행으로 시작합니다 0.
Alex Gittemeier

83

내 두 센트 :

엄격 모드의 목표 중 하나는 문제를 더 빨리 디버깅 할 수 있도록하는 것입니다. 그것은 당신의 웹 페이지의 조용하고 이상한 행동을 유발할 수있는 특정 잘못된 일이 발생할 때 예외를 던져 개발자를 도와줍니다. 우리가 사용하는 순간use strict , 코드는 오류를 발생시켜 개발자가 미리 수정하는 데 도움이됩니다.

사용 후 배운 중요한 것들 use strict:

전역 변수 선언 방지 :

var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);

이제이 코드 nameoftree는 전역 범위에서 생성 되며을 사용하여 액세스 할 수 있습니다 window.nameoftree. use strict코드를 구현 하면 오류가 발생합니다.

잡히지 않은 ReferenceError : nameoftree가 정의되지 않았습니다

Sample

with진술을 제거 합니다 :

withuglify-js 와 같은 도구를 사용하여 문을 축소 할 수 없습니다 . 또한 향후 JavaScript 버전에서 더 이상 사용되지 않으며 제거되었습니다.

Sample

중복 방지 :

중복 속성이 있으면 예외가 발생합니다.

Uncaught SyntaxError : 엄격 모드에서는 객체 리터럴의 중복 데이터 속성이 허용되지 않습니다

"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};

더는 없지만 더 많은 지식을 얻을 필요가 있습니다.


ECMAScript 2015에서는 중복 속성 이름이 다시 허용됩니다! MDN 설명서를 참조하십시오 .
philmcole

62

작년에 출시 된 브라우저를 사용하는 경우 JavaScript 엄격 모드를 지원할 가능성이 높습니다. ECMAScript 5가 현재 표준이되기 전에는 이전 버전의 브라우저 만 지원하지 않습니다.

명령 주위의 따옴표는 코드가 이전 브라우저에서도 계속 작동하는지 확인합니다 (엄격한 모드에서 구문 오류를 생성하는 것은 일반적으로 스크립트가 이전 브라우저에서 감지하기 어려운 방식으로 작동하지 않게하지만).


12
그럼 어떻게합니까?
Anish Gupta

7
...이 부분적 으로 호환성을 설명 하지만 실제로는 수행하지 않습니다.
courtsimas

58

를 추가 "use strict";하면 다음과 같은 경우 스크립트가 실행되기 전에 SyntaxError가 발생합니다.

  • 미래 인 ECMAScript 버전에 대한 방법을 포장 (대한 예견에 새로 예약 된 키워드 중 하나를 사용하여 ECMAScript를 6 ) : implements, interface, let, package, private, protected, public, static,와 yield.

  • 블록에서 함수 선언

    if(a<b){ function f(){} }
  • 8 진법

    var n = 023;
  • this 전역 객체를 가리 킵니다.

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
  • 객체 리터럴에서 속성 이름에 대해 동일한 이름을 두 번 선언

     {a: 1, b: 3, a: 7} 

    ECMAScript 6에서는 더 이상 해당되지 않습니다 ( 버그 1041128 ).

  • 이름 함수가 동일한 두 개의 함수 인수 선언

    f(a, b, b){}
  • 선언되지 않은 변수에 값 설정

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
  • 사용 delete변수 이름에delete myVariable;

  • 사용 eval또는 arguments변수 나 함수 인수의 이름으로

    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 

출처 :


ECMAScript 2015에서는 중복 속성 이름이 다시 허용됩니다! MDN 설명서를 참조하십시오 .
philmcole

53

엄격 모드는 일반적인 JavaScript 의미를 몇 가지 변경합니다.

  • 오류를 발생 시키도록 일부 JavaScript 자동 오류를 변경하여 제거합니다.

  • JavaScript 엔진이 최적화를 수행하기 어려운 오류를 수정합니다.

  • 향후 버전의 ECMAScript에서 정의 될 수있는 일부 구문을 금지합니다.

자세한 정보를 보려면 엄격한 모드 -Javascript


52

"엄격한 사용"; 프로그래머가 JavaScript의 느슨하거나 나쁜 속성을 사용하지 않는 보험입니다. 통치자가 직선을 만드는 데 도움이되는 것처럼 가이드입니다. "엄격한 사용"은 "직선 코딩"에 도움이됩니다.

눈금자를 사용하여 직선을 바로 사용하지 않으려는 사람들은 대개 다른 사람들이 코드를 디버깅하도록 요청하는 해당 페이지에서 끝납니다.

나를 믿어. 잘못 설계된 코드와 비교할 때 오버 헤드는 무시할 수 있습니다.몇 년 동안 수석 JavaScript 개발자였던 Doug Crockford는 여기에 매우 흥미로운 게시물을 가지고 있습니다 . 개인적으로, 나는 항상 좋은 습관을 잊지 않도록 자신의 사이트로 돌아갑니다.

현대의 JavaScript 실습은 항상 "엄격한 사용"을 불러 일으켜야합니다. 프라 그마. ECMA 그룹이 "엄격한"모드를 옵션 으로 설정 한 유일한 이유는 경험이 적은 코더가 JavaScript에 액세스 할 수 있도록 허용 한 다음 새롭고보다 안전한 코딩 방법에 적응할 시간을주기 위해서입니다.


66
엄격 모드가 선택적인 이유는 언급 한 내용과 관련이 없습니다. 실제 이유 는 일치하지 않을 수있는 기존 코드를 중단하지 않기위한 것 입니다.
Dexygen

17
실제로 경험이 적은 코더 는 "엄격한 사용"을 가능하게하는 첫 번째 코더 여야합니다 .
Antti Haapala

46

use strict이 시점부터 모든 민감한 JavaScript 파일의 시작 부분을 포함 시키는 것은 더 나은 JavaScript 프로그래머가되고 무작위 변수가 전역으로 변하지 않고 일이 조용히 변하는 것을 피할 수있는 작은 방법입니다.


42

w3schools에서 인용 :

"엄격한 사용"지침

"엄격한 사용"지시문은 JavaScript 1.8.5 (ECMAScript 버전 5)의 새로운 기능입니다.

이전 버전의 JavaScript에서는 무시 된 문이 아니라 리터럴 표현식입니다.

"엄격 사용"의 목적은 코드가 "엄격 모드"에서 실행되어야 함을 나타냅니다.

엄격 모드에서는 선언되지 않은 변수를 사용할 수 없습니다.

왜 엄격한 모드입니까?

엄격한 모드를 사용하면 "보안"JavaScript를보다 쉽게 ​​작성할 수 있습니다.

엄격한 모드는 이전에 허용 된 "잘못된 구문"을 실제 오류로 변경합니다.

예를 들어, 일반적인 JavaScript에서 변수 이름을 잘못 입력하면 새로운 전역 변수가 만들어집니다. 엄격 모드에서는 실수로 전역 변수를 만들 수 없습니다.

일반적인 JavaScript에서 개발자는 쓸 수없는 속성에 값을 할당하는 오류 피드백을받지 않습니다.

엄격 모드에서는 쓸 수없는 속성, 게터 전용 속성, 존재하지 않는 속성, 존재하지 않는 변수 또는 존재하지 않는 개체에 할당하면 오류가 발생합니다.

자세한 내용은 http://www.w3schools.com/js/js_strict.asp 를 참조하십시오


37

"use strict"JavaScript 코드가 엄격 모드 에서 실행되도록 합니다 . 기본적으로 모든 것은 사용하기 전에 정의해야합니다. 엄격 모드를 사용하는 주된 이유는 정의되지 않은 메소드가 실수로 전역 적으로 사용되는 것을 피하기 위함입니다.

또한 엄격 모드에서는 상황이 더 빨리 실행되고 일부 경고 또는 자동 경고는 치명적인 오류를 발생시키기 때문에 항상 깔끔한 코드를 만드는 데 사용하는 것이 좋습니다.

"use strict"ECMA5에서 널리 사용되어야하며, ECMA6에서는 기본적으로 JavaScript의 일부 이므로 ES6을 사용하는 경우 추가 할 필요가 없습니다.

MDN의 다음 진술과 예를 살펴보십시오.

"
Use strict"지시문 "use strict"지시문은 JavaScript 1.8.5 (ECMAScript 버전 5)의 새로운 기능입니다. 이전 버전의 JavaScript에서는 무시 된 문이 아니라 리터럴 표현식입니다. "엄격한 사용"의 목적은 코드가 "엄격 모드"에서 실행되어야 함을 나타냅니다. 엄격 모드에서는 선언되지 않은 변수를 사용할 수 없습니다.

"엄격한 사용"예 :
함수의 엄격한 모드 : 마찬가지로 함수의 엄격한 모드를 호출하려면 "use strict"라는 정확한 문장을 입력하십시오. 다른 문장보다 먼저 함수 본문에서 (또는 '엄격한 사용';)

1) 기능의 엄격 모드

 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."; }

 console.log(strict(), notStrict());

2) 전체 스크립트 엄격 모드

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

3) 쓰기 불가능한 글로벌에 할당

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

MDN에 대한 자세한 내용을 읽을 수 있습니다 .


31

ECMAScript위원회에 참여한 일부 사람들은 JavaScript의 변경 사항, 제 1 부 : ECMAScript 5 " 를 통해 "use strict"스위치를 점진적으로 사용하여 JavaScript 구현자가 모든 웹 사이트를 갑자기 중단하지 않고 JavaScript의 많은 위험한 기능을 정리하는 방법에 대해 이야기하고 있습니다. 세상에.

물론 이러한 많은 기능이 무엇인지와 ECMAScript 5가 어떻게이를 고치는 지에 대해서도 이야기합니다.


27

비교할 작은 예 :

엄격하지 않은 모드 :

for (i of [1,2,3]) console.log(i)
    
// output:
// 1
// 2
// 3

엄격한 모드 :

'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

엄격하지 않은 모드 :

String.prototype.test = function () {
  console.log(typeof this === 'string');
};

'a'.test();

// output
// false

String.prototype.test = function () {
  'use strict';
  
  console.log(typeof this === 'string');
};

'a'.test();

// output
// true


2
위의 코드는 i 변수를 전역 범위에 추가합니다 (일반적으로 이것은 최선의 방법이 아니며 엄격 모드는 이를 피하는 데 도움이 됨).
michael

1
누군가 두 번째 예를 설명 할 수 있습니까? 나는 그것을 얻지 못한다. 안 this === 'a'두 예에서 모두?
MaximeW

19

use strict에 도입 된 ECMA 스크립트 (5) 그 이후로 유지했다.

ES6ES7 에서 엄격 모드를 트리거하는 조건은 다음 과 같습니다.

  • 전역 코드는 엄격한 사용 지침 (14.1.1 참조)이 포함 된 Directive Prologue로 시작하는 경우 엄격한 모드 코드입니다.
  • 모듈 코드는 항상 엄격 모드 코드입니다.
  • ClassDeclaration 또는 ClassExpression 의 모든 부분 은 엄격 모드 코드입니다.
  • Eval 코드는 Use Strict Directive가 포함 된 Directive Prologue로 시작하거나 Eval에 대한 호출이 Strict Mode 코드에 포함 된 직접 Eval (12.3.4.1 참조) 인 경우 엄격한 모드 코드입니다.
  • 연결된 FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition 또는 ArrowFunction 인 경우 함수 코드는 엄격한 모드 코드입니다. 이 엄격한 모드 코드에 포함되어 있거나 함수의 [[ECMAScriptCode]] 내부 슬롯의 값을 생성하는 코드가 Directive Prologue로 시작하는 경우 함수 코드는 엄격한 모드 코드입니다. 엄격한 사용 지침이 포함되어 있습니다.
  • 마지막 인수가 처리 될 때 엄격한 지시문이 포함 된 지시문 프롤로그로 시작 하는 FunctionBody 인 문자열 인 경우 내장 함수 및 생성자 생성자에 인수로 제공되는 함수 코드는 엄격한 모드 코드 입니다.

14

개발자가 사용해야하는 주요 이유 "use strict"는 다음과 같습니다.

  1. 실수로 전역 변수 "use strict()"를 선언하지 않도록 var합니다. 사용 하면 변수 를 사용하기 전에 선언 해야합니다. 예 :

    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
  2. 주의 : "use strict"지시문은 스크립트 나 함수의 시작 부분에서만 인식됩니다.
  3. 문자열 "arguments"은 변수로 사용할 수 없습니다 :

    "use strict";
    var arguments = 3.14;    // This will cause an error
  4. 키워드 사용을 변수로 제한합니다. 그것들을 사용하려고하면 오류가 발생합니다.

간단히 말해서 코드 오류가 덜 발생하게되고 좋은 코드를 작성하게됩니다.

이에 대한 자세한 내용은 여기 를 참조 하십시오 .


12

"엄격한 사용"; JavaScript를 좀 더 강력하게 만들기위한 ECMA의 노력입니다. JS는 최소한 "엄격한"(다른 언어는 90 년대 이후 엄격한 규칙을 구현)하려고 시도했다. 실제로 JavaScript 개발자는 일종의 코딩 모범 사례를 따르도록 강요합니다. 여전히 JavaScript는 매우 취약합니다. 유형 변수, 유형 메소드 등은 없습니다. JavaScript 개발자는 Java 또는 ActionScript3와 같은 더 강력한 언어를 배우고 JavaScript 코드에서 동일한 모범 사례를 구현하는 것이 좋습니다. 디버그.


12

ECMAScript 5에 JavaScript "strict"모드가 도입되었습니다.

(function() {
  "use strict";
  your code...
})();

"use strict";JS 파일 맨 위에 작성 하면 엄격한 구문 검사가 설정됩니다. 우리를 위해 다음과 같은 작업을 수행합니다.

  1. 선언되지 않은 변수에 할당하려고하면 오류가 표시됩니다

  2. 주요 JS 시스템 라이브러리를 덮어 쓰지 못하게합니다.

  3. 안전하지 않거나 오류가 발생하기 쉬운 언어 기능을 금지합니다

use strict또한 개별 기능 내에서 작동합니다. 항상 use strict코드 에 포함시키는 것이 좋습니다 .

브라우저 호환성 문제 : "use"지시문은 이전 버전과 호환됩니다. 이를 지원하지 않는 브라우저는 더 이상 참조되지 않는 문자열 리터럴 만 보게됩니다. 그래서 그들은 그것을 넘겨 나갈 것입니다.


12

use strict예상대로 작동하지 않는 위험한 기능을 사용할 수 없기 때문에 코드를보다 안전하게 만드는 방법입니다. 그리고 이전에 작성된 것처럼 코드를 더욱 엄격하게 만듭니다.


11

Use Strict는 일반적으로 반복되는 오류를 표시하여 다르게 처리되고 Java 스크립트 실행 방식을 변경하는 데 사용됩니다. 이러한 변경 사항은 다음과 같습니다.

  • 우발적 인 글로벌을 방지

  • 중복 없음

  • 와 함께 제거

  • 이 강요를 제거합니다

  • 보다 안전한 평가 ()

  • 불변의 에러

자세한 내용은 이 기사 를 읽을 수도 있습니다


11

일반적으로 JavaScript는 엄격한 규칙을 따르지 않으므로 오류 가능성이 높아집니다. 을 사용한 후 "use strict"JavaScript 코드는 종료 기 사용, 초기화 전 선언 등과 같은 다른 프로그래밍 언어에서와 같이 엄격한 규칙을 따라야합니다.

"use strict"를 사용하는 경우 엄격한 규칙 집합을 따라 코드를 작성해야하므로 오류 및 모호성이 줄어 듭니다.


7

"엄격한 사용"; JavaScript 코드가 "엄격 모드"에서 실행되도록 정의합니다.

  • "엄격한 사용"지시문은 ECMAScript 버전 5에서 새로 추가되었습니다.
  • 이전 버전의 JavaScript에서는 무시 된 문이 아니라 리터럴 표현식입니다.
  • "엄격 사용"의 목적은 코드가 "엄격 모드"에서 실행되어야 함을 나타냅니다.
  • 엄격 모드에서는 선언되지 않은 변수를 사용할 수 없습니다.

Internet Explorer 9 이하를 제외한 모든 최신 브라우저는 "엄격한 사용"을 지원 합니다.

불리

개발자가 엄격 모드 인 라이브러리를 사용했지만 개발자가 정상 모드에서 작업하는 데 익숙한 경우 라이브러리에서 예상대로 작동하지 않는 일부 조치를 호출 할 수 있습니다.

더 나쁜 것은 개발자가 일반 모드이기 때문에 추가 오류가 발생한다는 이점이 없으므로 오류가 자동으로 실패 할 수 있습니다.

또한 위에 나열된 것처럼 엄격 모드는 특정 작업을 수행하지 못하게합니다.

사람들은 일반적으로 처음부터 그런 것들을 사용해서는 안된다고 생각하지만 일부 개발자는 제약 조건을 좋아하지 않으며 언어의 모든 기능을 사용하고 싶어합니다.


4

엄격 모드는 메모리 누수를 방지 할 수 있습니다.

엄격하지 않은 모드로 작성된 아래 기능을 확인하십시오.

function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); // Stack Overflow

이 함수에서 우리는 name 내에서 합니다. 내부적으로 컴파일러는 먼저 특정 함수 범위에 해당 특정 이름으로 선언 된 변수가 있는지 확인합니다. 컴파일러는 그러한 변수가 없다는 것을 이해했기 때문에 외부 범위를 검사합니다. 우리의 경우, 그것은 세계적인 범위입니다. 다시 말하지만 컴파일러는 해당 이름을 가진 전역 공간에 선언 된 변수도 없다는 것을 이해했기 때문에 전역 공간에서 이러한 변수를 만듭니다. 개념적으로이 변수는 전역 범위에서 만들어지며 전체 응용 프로그램에서 사용할 수 있습니다.

또 다른 시나리오는 변수가 자식 함수에서 선언되는 것입니다. 이 경우 컴파일러는 외부 범위, 즉 상위 함수에서 해당 변수의 유효성을 확인합니다. 그래야만 글로벌 공간을 체크인하고 거기에 변수를 만들 수 있습니다. 즉, 추가 점검이 필요합니다. 이것은 응용 프로그램의 성능에 영향을 미칩니다.


이제 엄격 모드에서 같은 함수를 작성해 봅시다.

"use strict"
function getname(){
    name = "Stack Overflow"; // Not using var keyword
    return name;
}
getname();
console.log(name); 

다음과 같은 오류가 발생합니다.

Uncaught ReferenceError: name is not defined
at getname (<anonymous>:3:15)
at <anonymous>:6:5

여기서 컴파일러는 참조 오류를 발생시킵니다. 엄격 모드에서는 컴파일러가 변수를 선언하지 않고 사용할 수 없습니다. 따라서 메모리 누수가 방지 될 수 있습니다. 또한 더 최적화 된 코드를 작성할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.