무엇이"사용은 엄격한"지에서 자바스크립트,그리고 무엇 뒤에 그것은?

StackOverflow https://stackoverflow.com/questions/1335851

문제

최근에,나는 일부의 내 JavaScript 코드를 통해 Crockford 의 JSLint, 에게 다음과 같은 오류가:

문제 라인 1 에서 문자 1:Missing"사용은 엄격한"문입니다.

을 찾고,내가 깨달았는 어떤 사람들은 추가 "use strict"; 으로 자신의 JavaScript 코드입니다.저는 성명,오류 정지 나타납니다.불행하게도,Google 공개하지 않았다 훨씬 역사의 뒤에 이 문자열에는 문입니다.물론 그것은 무언가가 있어야 한다 어떻게 자바스크립트가 브라우저에 의해 해석,하지만 나는 아이디어가 있지 않 어떠한 영향을 미치는가를 될 것입니다.

그래서 무엇 "use strict"; 모든에 대해,그것은 무엇을 의미하며,그것은 여전히 관련성이 있습니까?

어떤 현재 브라우저에 응답 "use strict"; 문자열이나 그것은 미래를 위해 사용합니까?

도움이 되었습니까?

해결책

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

몇 가지 흥미로운 부분을 인용합니다.

Strict Mode는 ECMAScript 5의 새로운 기능으로 "엄격한"작동 컨텍스트에 프로그램 또는 함수를 배치 할 수 있습니다. 이 엄격한 맥락은 특정 행동이 취해지는 것을 방지하고 더 많은 예외를 던집니다.

그리고:

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

  • 그것은 일반적인 코딩 블로 퍼를 포착하여 예외를 던집니다.
  • 상대적으로 "안전하지 않은"조치가 취해지면 (예 : 글로벌 객체에 대한 액세스를 얻는 것과 같은) 오류를 방지하거나 오류가 발생합니다.
  • 혼란 스럽거나 제대로 생각하지 않는 기능을 비활성화합니다.

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

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code... 

구식과 새 코드를 혼합해야한다면 도움이 될 수 있습니다 ;-)

그래서 나는 그것이 조금 비슷하다고 생각합니다. "use strict" Perl에서 사용할 수 있습니다 (따라서 이름은?): 파손으로 이어질 수있는 더 많은 것을 감지하여 더 적은 오류를 일으키는 데 도움이됩니다.

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

내부에 기본 ECMAScript 모듈 (와 함께 import 그리고 export 진술) 및 ES6 클래스, 엄격한 모드는 항상 활성화되어 있으며 비활성화 할 수 없습니다.

다른 팁

그것은 ecmascript 5의 새로운 기능입니다. John Resig는 썼습니다. 좋은 요약 그것의.

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

"use strict";

이제 코드에 넣으면 현재 브라우저에 문제가 발생하지 않아야합니다. 코드가 Pragma를 위반하는 경우 향후 코드에 문제가 발생할 수 있습니다. 예를 들어, 현재 가지고있는 경우 foo = "bar" 정의하지 않고 foo 첫째, 코드가 실패하기 시작합니다 ... 제 생각에는 좋은 일입니다.

진술 "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. 옥탈 구문 금지 (var x = 023; 일부 개발자는 이전 0이 숫자를 변경하기 위해 아무것도하지 않는다고 잘못 가정합니다.)

  7. 금지합니다 with 예어

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

  9. 평범한 이름을 삭제하는 금지 (delete x;)

  10. 이름의 구속력 또는 할당을 금지합니다 eval 그리고 arguments 어떤 형태로든

  11. 엄격한 모드는 속성의 별칭이 아닙니다 arguments 공식 매개 변수가있는 객체. (즉, IE function sum (a,b) { return arguments[0] + b;} 이것은 작동하기 때문에 작동합니다 arguments[0] 묶여 있습니다 a 등등. )

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

REF : 엄격한 모드, 모질라 개발자 네트워크]

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

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

브라우저 지원에 대해 이야기하지만 더 중요한 것은 안전하게 다루는 방법입니다.

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.
*/

주의의 한마디, 모든 하드 충전 프로그래머 : 적용 "use strict" 기존 코드로는 위험 할 수 있습니다! 이것은 코드를 '더 나은'으로 만들기 위해 코드를 때릴 수있는 기분이 좋고 행복한 얼굴 스티커가 아닙니다. 이랑 "use strict" PRAGMA, 브라우저는 갑자기 무작위 장소에서 갑자기 예외를 제외하고 그 자리에서 기본/느슨한 JavaScript가 행복하게 허용하지만 엄격한 JavaScript Abhors를 허용하기 때문에 전에 결코 던지지 않은 임의의 장소에서 예외를 던질 것입니다! 코드에서 거의 사용되지 않은 전화에 숨어있는 엄격함 위반이있을 수 있으며, 이는 결국 실행할 때만 예외 만 발생합니다.

급락을하려면 신청하는 것이 좋습니다. "use strict" 포괄적 인 단위 테스트 및 엄격하게 구성된 Jshint 빌드 작업과 함께 엄격한 모드를 켰기 때문에 모듈의 어두운 코너가 없다는 확신을 줄 수 있습니다. 또는, 여기 또 다른 옵션이 있습니다 : 그냥 추가하지 마십시오 "use strict" 레거시 코드 중 하나에게는 솔직히 더 안전 할 것입니다. 확실히 그렇지 않습니다 추가하다 "use strict" 타사 모듈과 같이 소유하거나 유지 관리하지 않는 모든 모듈에.

나는 그것이 치명적인 갇힌 동물이라고 생각하지만 "use strict" 좋은 일이 될 수 있지만 제대로해야합니다. 엄격한 시간은 프로젝트가 Greenfield이고 처음부터 시작하는시기입니다. 구성 JSHint/JSLint 팀이 위장 할 수있는만큼 꽉 조이는 모든 경고와 옵션으로, 좋은 빌드/테스트/어제 시스템을 얻으십시오. Grunt+Karma+Chai, 그런 다음 모든 새 모듈을 다음과 같이 표시하기 시작합니다. "use strict". 많은 멍청한 오류와 경고를 치료할 준비를하십시오. 빌드가 실패하도록 구성하여 모든 사람이 중력을 이해하는지 확인하십시오. JSHint/JSLint 위반을 생성합니다.

내 프로젝트는 내가 채택했을 때 그린 필드 프로젝트가 아니 었습니다. "use strict". 결과적으로 내 IDE는 내가 가지고 있지 않기 때문에 빨간 자국으로 가득합니다. "use strict" 내 모듈의 절반에 jshint는 그것에 대해 불평합니다. 그것은 앞으로 어떤 리팩토링이 해야하는지에 대해 상기시켜줍니다. 내 목표는 내 모든 빠진 때문에 빨간 마크가없는 것입니다. "use strict" 진술이지만 지금은 몇 년이 지났습니다.

사용 'use strict'; 갑자기 코드를 더 좋게 만들지 않습니다.

그만큼 JavaScript 엄격한 모드 기능입니다 ECMAScript 5. 스크립트/함수 상단에서 이것을 선언하여 엄격한 모드를 활성화 할 수 있습니다.

'use strict';

JavaScript 엔진이 이것을 볼 때 지령, 코드를 특수 모드에서 해석하기 시작합니다. 이 모드에서는 잠재적 인 버그가 될 수있는 특정 코딩 관행이 감지 될 때 (엄격한 모드의 추론) 오류가 발생합니다.

이 예를 고려하십시오 :

var a = 365;
var b = 030;

숫자 리터럴을 정렬하려는 강박 관념에서 개발자는 실수로 초기화 된 변수를 사용했습니다. b 문자 문자가 있습니다. 비 스트릭 모드는 이것을 값을 가진 숫자 문자로 해석합니다. 24 (베이스 10). 그러나 엄격한 모드는 오류가 발생합니다.

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


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

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

  • 기존의 자바 스크립트 코드 : 아마도! 기존 JavaScript 코드에 엄격한 모드에서 금지 된 명령문이있는 경우 응용 프로그램은 간단히 중단됩니다. 엄격한 모드를 원한다면 기존 코드를 디버그하고 수정할 준비가되어 있어야합니다. 이는 이유 사용 'use strict'; 갑자기 코드를 더 좋게 만들지 않습니다.


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

  1. 삽입 a 'use strict'; 스크립트 위에 진술 :

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

    파일의 모든 것입니다 myscript.js 엄격한 모드로 해석됩니다.

  2. 또는 삽입 a 'use strict'; 기능 본문 위에 진술 :

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

    모든 것 어휘 범위 기능의 doSomething 엄격한 모드로 해석됩니다. 단어 어휘 범위 여기에서 중요합니다. 보다 이 답변 더 나은 설명을 위해.


엄격한 모드에서 어떤 일이 금지되어 있습니까?

나는 a를 찾았다 좋은 기사 엄격한 모드에서 금지되는 몇 가지 사항을 설명합니다 (이것은 독점 목록이 아님) :

범위

역사적으로 JavaScript는 기능이 어떻게 범위를 지르는 지에 대해 혼란 스러웠습니다. 때때로 그들은 정적으로 범위를 지키는 것처럼 보이지만 일부 기능은 동적으로 범위를 가진 것처럼 행동하게 만듭니다. 이것은 혼란스럽고 프로그램을 읽고 이해하기 어렵게 만듭니다. 오해하면 버그가 발생합니다. 또한 성능에 문제가 있습니다. 정적 범위는 컴파일 시간에 가변 바인딩이 발생할 수있게하지만 동적 범위에 대한 요구 사항은 바인딩이 런타임으로 지연되어야하며, 이는 상당한 성능 페널티가 제공되어야한다는 것을 의미합니다.

엄격한 모드는 모든 가변 바인딩을 정적으로 수행해야합니다. 즉, 이전에 동적 바인딩이 필요한 기능을 제거하거나 수정해야합니다. 구체적으로, With 명령문이 제거되고 Eval 함수의 발신자 환경을 조작하는 능력은 심각하게 제한됩니다.

엄격한 코드의 이점 중 하나는 유비 압축기처리 할 때 더 나은 일을 할 수 있습니다.

묵시적 글로벌 변수

JavaScript는 글로벌 변수를 암시했습니다. 변수를 명시 적으로 선언하지 않으면 글로벌 변수가 암시 적으로 선언됩니다. 이를 통해 초보자는 기본적인 하우스 키핑 집안일을 무시할 수 있기 때문에 초보자에게 더 쉽게 프로그래밍 할 수 있습니다. 그러나 더 큰 프로그램의 관리가 훨씬 더 어려워지고 신뢰성이 크게 저하됩니다. 따라서 엄격한 모드에서는 묵시적 글로벌 변수가 더 이상 생성되지 않습니다. 모든 변수를 명시 적으로 선언해야합니다.

글로벌 누출

발생할 수있는 여러 상황이 있습니다 this글로벌 대상에 묶여 있습니다. 예를 들어, 제공하는 것을 잊어 버린 경우 new PREFIX 생성자 함수를 호출 할 때 생성자 this 예기치 않게 글로벌 객체에 묶여 있으므로 새 객체를 초기화하는 대신 대신 전역 변수를 조용히 조작 할 수 있습니다. 이러한 상황에서는 엄격한 모드가 대신 바인딩됩니다 this 에게 undefined, 생성자가 대신 예외를 던지게하여 오류가 훨씬 빨리 감지 될 수 있습니다.

시끄러운 실패

JavaScript는 항상 읽기 전용 속성을 가지고 있었지만 ES5까지 직접 만들 수는 없었습니다. Object.createProperty기능은 그 기능을 노출시켰다. 값을 읽기 전용 속성에 할당하려고하면 조용히 실패합니다. 과제는 부동산의 가치를 바꾸지 않지만 프로그램은 마치 마치 마치 진행됩니다. 이것은 프로그램이 일관성없는 상태로 들어가게 할 수있는 무결성 위험입니다. 엄격한 모드에서는 읽기 전용 속성을 변경하려고 시도하면 예외가 발생합니다.

10 월

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

C에서, 옥탈의 매우 불행한 표현이 선택되었다 : 주요 0. 그래서 C에서 0100 100이 아닌 64를 의미합니다 08 더 불행히도,이 구식주의는 오류를 생성하는 데만 사용되는 JavaScript를 포함한 거의 모든 현대 언어로 복사되었습니다. 다른 목적이 없습니다. 따라서 엄격한 모드에서는 옥탈 형태가 더 이상 허용되지 않습니다.

등등

인수 의사 배열은 ES5에서 조금 더 배열과 같습니다. 엄격한 모드에서는 잃어 버립니다 callee 그리고 caller속성. 이것은 당신을 통과 할 수있게합니다 arguments 많은 기밀 컨텍스트를 포기하지 않고 신뢰할 수없는 코드. 또한, arguments 기능의 속성이 제거됩니다.

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


향후 JavaScript 버전에 대한 예약 된 단어

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

implements, interface, let, package, private, protected, public, static, 그리고 yield


추가 독서

나는 모든 개발자가 지금 엄격한 모드를 사용하는 것을 강력히 권장합니다. 엄격한 모드가 합법적으로 코드에 있다는 오류로부터 우리를 저장하는 데 도움이 될 수있는 충분한 브라우저가 있습니다.

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

예를 들어,

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

jslint Douglas Crockford가 작성한 디버거입니다. 스크립트에 붙여 넣기 만하면 코드에서 눈에 띄는 문제와 오류가 빠르게 스캔됩니다.

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

당신은 참조 할 수 있습니다 MDN 문서 자세한 내용은.

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

지시문은 진술과 유사하지만 다릅니다.

  • use strict 핵심 단어가 포함되어 있지 않습니다. 지침은 간단한 표현식 문으로 특수 문자열 문자 (단일 또는 이중 인용)로 구성됩니다. ECMAScript 5를 구현하지 않는 JavaScript 엔진은 단지 부작용이없는 표현식 진술을 볼뿐입니다. ECMAScript 표준의 미래 버전이 소개 할 것으로 예상됩니다. use 진정한 키 단어로서; 따라서 인용문은 쓸모 없게 될 것입니다.
  • use strict 스크립트의 시작 부분이나 함수의 시작 부분에서만 사용할 수 있습니다. 즉, 다른 모든 (실제) 진술보다 우선해야합니다. 함수 스크립트에서 첫 번째 명령어가 필요하지 않습니다. 문자열 리터럴로 구성된 다른 명령문 표현이 선행 될 수 있습니다 (및 JavaScript 구현은이를 구현 특정 지침으로 취급 할 수 있음). 첫 번째 실제 진술 (스크립트 또는 함수)을 따르는 문자 리터럴 문은 간단한 표현식 문입니다. 통역사는 그것들을 지침으로 해석해서는 안되며 영향을 미치지 않습니다.

그만큼 use strict 지시문은 다음 코드 (스크립트 또는 함수에서)가 엄격한 코드임을 나타냅니다. 스크립트가 use strict 지령. 함수의 내용은 함수 자체가 엄격한 코드로 정의되거나 함수에 A가 포함 된 경우 엄격한 코드로 간주됩니다. use strict 지령. 전달되는 코드 eval() 방법은 엄격한 코드로 간주됩니다 eval() 엄격한 코드에서 호출되거나 포함됩니다 use strict 지시 자체.

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

  • 당신은 사용할 수 없습니다 with-엄격한 모드에서의 단계.
  • 엄격한 모드에서 모든 변수가 선언되어야합니다. 변수, 함수, 함수 매개 변수, Catch-Clause 매개 변수 또는 글로벌 속성으로 선언되지 않은 식별자에게 값을 할당하는 경우 Object, 그러면 당신은 얻을 것입니다 ReferenceError. 일반 모드에서 식별자는 글로벌 변수로 암시 적으로 선언됩니다 (글로벌의 속성으로 Object)
  • 엄격한 모드에서 키워드 this 가치가 있습니다 undefined 함수로 호출 된 함수에서 (방법이 아님). (정상 모드에서 this 항상 글로벌을 가리 킵니다 Object). 이 차이는 구현이 엄격한 모드를 지원하는지 테스트하는 데 사용될 수 있습니다.
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • 또한 함수가 호출 될 때 call() 또는 apply 그러면 엄격한 모드에서 this 정확히 첫 번째 인수의 가치입니다. call()또는 apply() 기도. (정상 모드에서 null 그리고 undefined 글로벌로 대체됩니다 Object 그리고 객체가 아닌 값은 물체로 캐스팅됩니다.)

  • 엄격한 모드에서는 a TypeError, readonly 속성에 할당하거나 확장 불가능한 객체에 대한 새로운 속성을 정의하려고 할 때. (일반 모드에서는 오류 메시지없이 단순히 실패합니다.)

  • 엄격한 모드에서 코드를 전달할 때 eval(), 발신자의 범위에서 변수 나 함수를 선언하거나 정의 할 수 없습니다 (일반 모드에서 할 수있는대로). 대신, 새로운 범위가 생성됩니다 eval() 변수와 함수는 그 범위 내에 있습니다. 그 범위는 이후에 파괴됩니다 eval() 실행을 완료합니다.
  • 엄격한 모드에서 인수-기능의 인수에는 해당 함수로 전달되는 값의 정적 사본이 포함되어 있습니다. 정상 모드에서 인수는 다소 "마법의"동작을 가지고 있습니다. 배열의 요소와 명명 된 함수 매개 변수는 동일한 값을 모두 참조합니다.
  • 엄격한 모드에서는 a SyntaxErrordelete 연산자 다음에 비 자격 식별자 (변수, 함수 또는 함수 매개 변수)가 뒤 따릅니다. 정상 모드에서 delete 표현은 아무것도하지 않고 평가됩니다 false.
  • 엄격한 모드에서는 a TypeError 구성 불가능한 속성을 삭제하려고 할 때. (일반 모드에서는 시도가 단순히 실패하고 delete 표현이 평가됩니다 false).
  • 엄격한 모드에서는 객체 문자 그대로 동일한 이름의 여러 속성을 정의하려고 할 때 구문 적 오류로 간주됩니다. (일반 모드에서는 오류가 없습니다.)
  • 엄격한 모드에서는 함수 선언에 동일한 이름의 여러 매개 변수가있는 경우 구문 오류로 간주됩니다. (일반 모드에서는 오류가 없습니다.)
  • 엄격한 모드에서 Octal Literals는 허용되지 않습니다 (이것은 시작하는 리터럴입니다. 0x. (일반 모드에서는 일부 구현에서는 옥탈 리터럴이 허용됩니다.)
  • 엄격한 모드에서 식별자 eval 그리고 arguments 키워드처럼 취급됩니다. 값을 변경할 수없고 값을 할당 할 수 없으며 캐치 블록의 변수, 함수, 기능 매개 변수 또는 식별자의 이름으로 사용할 수 없습니다.
  • 엄격한 모드에서는 통화 스택을 검사 할 가능성에 대한 더 많은 제한이 있습니다. arguments.caller 그리고 arguments.callee 원인 a TypeError 엄격한 모드의 함수에서. 또한 엄격한 모드에서 기능의 일부 발신자 및 인수 속성은 TypeError 당신이 그들을 읽으려고 할 때.

내 두 센트 :

엄격한 모드의 목표 중 하나는 문제의 더 빠른 디버깅을 허용하는 것입니다. 웹 페이지의 침묵하고 이상한 동작을 유발할 수있는 특정 잘못된 일이 발생할 때 예외를 던지는 데 도움이됩니다. 우리가 사용하는 순간 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 코드는 오류를 던질 것입니다.

Uncught ReferenceError : nameoftree는 정의되지 않았습니다

견본

제거합니다 with 성명 :

with 와 같은 도구를 사용하여 진술을 조정할 수 없습니다 uglify-js. 그들은 또한 감가 상각 된 미래의 JavaScript 버전에서 제거되었습니다.

견본

복제를 방지합니다.

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

Uncught SyntaxError : 엄격한 모드에서 허용되지 않는 객체 문자 그대로의 데이터 속성 중복 데이터 속성

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

더 많은 것이 있지만 그것에 대해 더 많은 지식을 얻어야합니다.

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

명령 주변의 따옴표는 코드가 오래된 브라우저에서도 여전히 작동하는지 확인해야합니다 (엄격한 모드에서 구문 오류를 생성하는 것은 일반적으로 스크립트가 해당 구형 브라우저에서 스크립트가 오작동을 일으킬뿐입니다).

추가 할 때 "use strict";, 다음 사례는 a SyntaxError 스크립트가 실행되기 전에 :

  • 미래의 ECMAScript 버전을위한 길을 푸데 포장합니다, 새로 예약 된 키워드 중 하나를 사용 (Prevision) ECMAScript 6): implements, interface, let, package, private, protected, public, static, 그리고 yield.

  • 블록에서 기능을 선언합니다

    if(a<b){ function f(){} }
    
  • 옥탈 구문

    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() { } 
    

출처 :

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

  • JavaScript 사일런트 오류가 오류를 던지기 위해 변경하여 일부 JavaScript 자동 오류를 제거합니다.

  • JavaScript 엔진이 최적화를 수행하기 어렵게 만드는 실수를 수정합니다.

  • 미래의 ECMAScript 버전에서 정의 될 가능성이있는 일부 구문을 금지합니다.

자세한 정보는 Vistit 엄격한 모드- JavaScript

"엄격한 사용"; 프로그래머가 JavaScript의 느슨한 또는 나쁜 속성을 사용하지 않는 보험입니다. 통치자가 직선을 만드는 데 도움이되는 가이드입니다. "Strict"를 사용하면 "스트레이트 코딩"을하는 데 도움이됩니다.

통치자를 사용하여 자신의 줄을 똑바로하는 것을 선호하는 사람들은 일반적으로 다른 사람들이 코드를 디버깅하도록 요구하는 페이지에서 끝납니다.

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

현대 자바 스크립트 연습은 항상 "엄격한 사용"을 불러 일으켜야합니다. 프라그마. ECMA 그룹이 "엄격한"모드를 선택한 유일한 이유 숙련 된 코더가 JavaScript에 대한 액세스를 허용하고 새롭고 안전한 코딩 관행에 적응할 시간을주는 것입니다.

포함 use strict 이 시점부터 모든 민감한 JavaScript 파일의 시작 부분에서 더 나은 JavaScript 프로그래머가되고 임의의 변수가 전 세계가되고 상황이 조용히 변하는 것을 피하는 작은 방법입니다.

에서 인용 w3schools:

"사용은 엄격한"지시어

"사용은 엄격한"지시어는 새로운에서 JavaScript1.8.5(ECMAScript 버 5).

그것은 문지만,리터럴 식에 의해 무시 이전 전 버전의 자바 스크립트.

의 목적은"사용은 엄격한"것임을 나타내는 이 코드 실행에서"엄격입니다."

와 함께 엄격한 모드로,당신은 할 수 없습니다,예를 들어,사용하여 선언되지 않은 변수입니다.

왜 엄격한 모?

엄격한 형태는 그것에 쉽게 작성하"보안"자바 스크립트.

엄격한 모드로 변경 내용 이전에 접수"damaged"실제 오류가 있습니다.

예를 들어,정상에서 자바스크립트,오타 변수 이름을 만듭니다 새로운 글로벌 변수입니다.엄격 모드에서,이는 오류가 발생합니다, 를 만드는 것이 불가능을 실수로서 전 세계적인 변수입니다.

에서 정상적인 JavaScript,개발자를 받지 않을 것이 어떤 오류가 의견 값을 할당 non-쓰기 가능한 속성입니다.

에 엄격한 모든 할당 non-쓰기 가능한 속성, getter-만산,non-기존 시설,비재 변수,또는 존재하지 않는 객체에서는 오류가 발생합니다.

를 참조하십시오 http://www.w3schools.com/js/js_strict.asp 을 더 알

"use strict" 만드는 JavaScript 코드에서 실행 엄격한 모, 기본적으로 의미 모든 것을 요구하기 전에 정의 사용입니다.주요 사용하는 이유는 엄격한 모드로 피하기 위해 실수로 글로벌 사용하여 정의되지 않은 방법이 있습니다.

또한 엄격 모드에서는,일을 빠르게 실행,일부는 경고 또는 침묵하는 경고를 던져 치명적인 오류로는,그것은 더 나은 항상 그것을 사용하 깔끔한 코드입니다.

"use strict" 널리 사용될 필요한에서 ECMA5, 에 ECMA6 그것의 일부 JavaScript 기본적으로, 래지 추가해야 하는 경우에 당신을 사용하여 ES6.

이러한 문장과 예부터 반:

"사용은 엄격한"지시어
"사용은 엄격한"지시어에서 새로운 JavaScript1.8.5(ECMAScript 버전 5).그것은 문지만, 리터럴 식에 의해 무시 이전 버전의 자바 스크립트.이 목적"의"엄격한 사용을 표시해야 하는 코드 실행에서"엄격입니다."와 함께 엄격한 모드로,당신은 할 수 없습니다,예를 들어, 사용하여 선언되지 않은 변수입니다.

의 예를 사용하여"사용은 엄격한":
엄격한 모드 기능:마찬가지로 호출하는 엄격한 모드 기능을 넣어 정확한 성명이"사용은 엄격한";(또는'사용은 엄격한';)에 함수의 몸 전에 다른 문이 있습니다.

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)할당 non-쓰기 가능한 글로벌

'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

자세히보기 반.

ECMAScript위원회에 있던 일부 사람들의 좋은 이야기가 있습니다. JavaScript 변경, 1 부 : ECMAScript 5 " 얼마나 점진적으로 사용되는지에 대해 "use strict" 스위치를 통해 JavaScript 구현자는 세계의 모든 웹 사이트를 갑자기 깨지 않고 JavaScript의 위험한 기능을 많이 정리할 수 있습니다.

물론 그것은 또한 그 잘못된 지식이 얼마나 많은지에 대해서만 이야기하고 ECMAScript 5가 어떻게 고정하는지에 대해 이야기합니다.

비교할 작은 예 :

비 스트릭 모드 :

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

주목하십시오 use strict 소개되었습니다 ECMAScript 5 그 이후로 유지되었습니다.

다음은 엄격한 모드를 트리거하는 조건입니다 ES6 그리고 ES7:

  • 글로벌 코드는 사용 엄격한 지침이 포함 된 지침 프롤로그로 시작하는 경우 엄격한 모드 코드입니다 (14.1.1 참조).
  • 모듈 코드는 항상 엄격한 모드 코드입니다.
  • a의 모든 부분 ClassDeclaration 또는 a classexpression 엄격한 모드 코드입니다.
  • 평가 코드는 엄격한 모드 코드입니다. 사용 엄격한 지침이 포함 된 지침 프롤로그로 시작하거나 평가 호출이 엄격한 모드 코드에 포함 된 직접 평가 (12.3.4.1 참조) 인 경우 엄격한 모드 코드입니다.
  • 기능 코드는 연관된 경우 엄격한 모드 코드입니다 FunctionDeclaration, Functionexpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition 또는 화살학 엄격한 모드 코드에 포함되거나 내부 슬롯의 내부 슬롯의 값을 생성하는 코드가 사용 엄격한 지시문을 포함하는 지침 프롤로그로 시작됩니다.
  • 내장 함수 및 생성기 생성자에 대한 인수로 제공되는 함수 코드 마지막 인수가 처리 될 때 처리 될 때의 문자열 인 경우 엄격한 모드 코드입니다. 기능체 그것은 사용 엄격한 지침이 포함 된 지침 프롤로그로 시작합니다.

개발자가 사용해야하는 주된 이유입니다 "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. NB : "use strict" 지침은 스크립트 또는 함수의 시작 부분에서만 인식됩니다.
  3. 문자열 "arguments" 변수로 사용할 수 없습니다.

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

한마디로 코드가 오류가 적게되면 좋은 코드를 작성하게됩니다.

그것에 대해 자세히 알아 보려면 참조 할 수 있습니다 여기.

"엄격한 사용"; JavaScript를 좀 더 강력하게 만드는 ECMA 노력입니다. JS에서 적어도 약간의 "엄격한"것으로 만들려고합니다 (다른 언어는 90 년대 이후 엄격한 규칙을 구현합니다). 실제로 JavaScript 개발자가 일종의 코딩 모범 사례를 따르도록 "강제". 그럼에도 불구하고 JavaScript는 매우 취약합니다. 유형 변수, 유형 된 방법 등과 같은 것은 없습니다. JavaScript 개발자가 Java 또는 ActionScript3과 같은보다 강력한 언어를 배우고 JavaScript 코드에서 동일한 모범 사례를 구현하는 것이 좋습니다. 더 잘 작동하고 더 쉽게 작동합니다. 디버그.

JavaScript "Strict"모드는 ECMAScript 5에 소개되었습니다.

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

글쓰기 "use strict"; JS 파일의 맨 위에는 엄격한 구문 확인이 켜집니다. 다음과 같은 작업을 수행합니다.

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

  2. 키 JS 시스템 라이브러리를 덮어 쓰는 것을 막을 수 있습니다

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

use strict 또한 개별 기능 내부에서 작동합니다. 항상 포함하는 것이 더 나은 연습입니다 use strict 코드에서.

브라우저 호환성 문제 : "사용"지시문은 뒤로 호환됩니다. 그들을 지원하지 않는 브라우저는 더 참조되지 않은 문자열 문자 만 볼 수 있습니다. 그래서 그들은 그것을지나 가서 계속 움직일 것입니다.

use strict 코드를 더 안전하게 만들 수있는 방법입니다. 예상대로 작동하지 않는 위험한 기능을 사용할 수 없기 때문에 코드가 더 엄격하게 만들어지기 전에 writed.

Strict 사용은 일반적이고 반복되는 오류를 표시하여 다르게 처리되도록 공통 및 반복 오류를 표시하는 데 사용되며 Java 스크립트가 실행되는 방식을 변경합니다. 이러한 변경 사항은 다음과 같습니다.

  • 우발적 인 글로벌을 방지합니다

  • 복제가 없습니다

  • 제거합니다

  • 이 강요를 제거합니다

  • 보다 안전한 평가 ()

  • 불변의 오류

이것을 읽을 수도 있습니다 기사 세부 사항을 위해

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

만약에 "use strict" 사용되면 코드는 엄격한 규칙 세트를 따라 작성해야하므로 오류와 모호성의 가능성이 줄어 듭니다.

"사용은 엄격한";을 정의하는 JavaScript 코드가 실행되어야에서 "엄격입니다."

  • "사용은 엄격한"지시어는 새로운 ECMAScript 버전 5.
  • 그것은 문지만,리터럴 식에 의해 무시 이전 전 버전의 자바 스크립트.
  • 의 목적은"사용은 엄격한"것임을 나타내는 이 코드 실행에서"엄격입니다."
  • 와 함께 엄격한 모드로,당신은 할 수 없습니다,예를 들어,사용하여 선언되지 않은 변수입니다.

모든 현대적인 브라우저가 지원"사용은 엄격한"제외 인터넷 익스플로러 9 와 낮.

단점

는 경우에 개발자가 사용하는 라이브러리에 엄격한 모드지만,개발자는 사용 작업은 일반 모드에서,그들은 수도 있습니다 전화를 몇 가지 작업에는 라이브러리 작동하지 않을 것으로 예상된다.

더 나쁘기 때문에,개발자는 정상 모드에서,그들은하지 않는 장점을 가지고 여분의 오류를 발생되는,그래서 오류가 실패할 수 있습니다.

또한,위에 나열된 엄격한 모드에서 당신을 중지하고 특정 것입니다.

사람들은 일반적으로 생각하는 당신은 사용하지 말아야 할 것들에 첫 번째 장소지만,일부 개발자들이 좋아하지 않은 제약 조건과 원하는 모든 기능을 사용하의 언어입니다.

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

비 스트릭 모드로 작성된 아래 기능을 확인하십시오.

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top