"엄격 모드"란 무엇이며 어떻게 사용됩니까?


134

Mozilla Developer Network에서 JavaScript 참조를 살펴본 결과라는 것을 발견했습니다 "strict mode". 나는 그것을 읽고 그것을 이해하는 데 어려움을 겪고 있습니다. 누군가가 일반적으로 그 목적이 무엇이며 어떻게 유용한 지 간략하게 설명 할 수 있습니까?


답변:


149

주요 목적은 더 많은 검사를 수행하는 것입니다.

"use strict";다른 코드보다 먼저 코드 상단에 추가 하십시오.

예를 들어 blah = 33;유효한 JavaScript입니다. 그것은 당신이 완전히 전역 변수를 만들 것을 의미합니다 blah.

그러나 엄격 모드에서는 키워드 "var"을 사용하여 변수를 선언하지 않았으므로 오류가 발생합니다.

대부분의 경우 임의의 범위의 중간에 전역 변수를 생성하려는 것은 아니며, 대부분 blah = 33작성된 시간 은 오류이며 프로그래머는 실제로 전역 변수가되기를 원하지 않았습니다. 쓰다 var blah = 33.

마찬가지로 기술적으로 유효한 많은 작업을 허용하지 않습니다. NaN = "lol"오류가 발생하지 않습니다. 또한 NaN의 값을 변경하지 않습니다. 엄격한 이것을 사용하면 (그리고 비슷한 이상한 문장) 오류가 발생합니다. 글을 쓸 이유가 없기 때문에 대부분의 사람들은 이것을 높이 평가하므로 NaN = "lol"오타가있을 가능성이 높습니다.

엄격 모드의 MDN 페이지에서 자세히 알아보기


4
이것은 MDN에있는 문서와 똑같은 복제본입니다
nkcmr

23
그렇다면 유틸리티에 대해 무엇을 이해하지 못합니까? 그것은 유효하지만 가장 가능성이 높은 오류를 포착하여 개발을 돕는 것을 목표로합니다.
Simon Sarris

34

Simon의 답변에서 아직 언급되지 않은 엄격 모드의 한 가지 측면은 함수 호출을 통해 호출 된 함수에서 엄격 모드가 설정 this된다는 것 undefined입니다.

그래서 이런 것들

function Obj() {
   this.a = 12;
   this.b = "a";
   this.privilegedMethod = function () {
      this.a++;
      privateMethod();
   };

   function privateMethod() {
     this.b = "foo";
   }
}

불필요 하게 전역 객체에 속성을 추가하는 대신에 privateMethod속성을 추가 할 수 없으므로 호출 될 때 오류가 발생 합니다.undefinedb


4
그래, 추가 privateMethod.bind(this)();하고 전화 해야합니다new jsbin.com
hlcs

엄격 모드에서 가장 중요한 제한 사항 : docs.microsoft.com/en-us/scripting/javascript/advanced/…
Krishna Mohan

21

엄격하게 분석 할 수있는 EcmaScript의 하위 집합이있을 수 있도록 엄격한 모드가 추가되어 이후 버전의 언어에 적합합니다. 엄격한 모드는 또한 엄격한 모드로 자신을 제한하는 개발자가 실수를 줄이고 버그를보다 분명하게 나타낼 수 있기를 희망하여 설계되었습니다.

다음 EcmaScript의 주요 버전이 될 Harmony 는 ES5 엄격 위에 구축 될 것입니다.

하모니는 너무 많은 모드를 피하기 위해 ES5 엄격 모드를 기반으로합니다.

다른 언어 실험도 엄격 모드에 의존합니다. SES 는 ES5 엄격 모드의 분석 가능성에 따라 다릅니다.

SES (Secure ECMAScript) 설계 실험

ES5 / Strict의 기능을 제거하거나 복구하여 오브젝트 기능 프로그래밍 언어를 설계하십시오.

SES에서 ES5 / Strict로 직접 변환해야합니다.

표준의 부록 C 는 엄격 모드와 일반 모드의 차이점을 설명합니다.

엄격한 모드 제한 및 예외

  • 식별자 "구현물", "인터페이스", "let", "package", "private", "protected", "public", "static"및 "yield"는 엄격 모드 코드 내에서 FutureReservedWord 토큰으로 분류됩니다. (7.6.12 [?]).
  • 엄격한 모드 코드를 처리 할 때 적합한 구현은 B.1.1에 설명 된대로 OctalIntegerLiteral을 포함하도록 NumericLiteral (7.8.3)의 구문을 확장 할 수 없습니다.
  • 엄격한 모드 코드 (10.1.1 참조)를 처리 할 때 적합한 구현은 B.1.2에 설명 된 것처럼 OctalEscapeSequence를 포함하도록 EscapeSequence의 구문을 확장 할 수 없습니다.
  • 선언되지 않은 식별자 또는 다른 방법으로 해결할 수없는 참조에 할당해도 전역 개체에 속성이 만들어지지 않습니다. 엄격한 모드 코드 내에서 간단한 할당이 발생하면 LeftHandSide를 확인할 수없는 참조로 평가해서는 안됩니다. 이것이 발생하면 ReferenceError 예외가 발생합니다 (8.7.2). LeftHandSide는 속성 값이 {[[Writable]] : false} 인 데이터 속성, 속성 값이 {[[Set]] : undefined} 인 접근 자 속성 또는 존재하지 않는 데이터 속성에 대한 참조가 아닐 수도 있습니다. [[Extensible]] 내부 속성의 값이 false 인 객체의 속성. 이 경우 TypeError 예외가 발생합니다 (11.13.1).
  • 식별자 평가 또는 인수는 할당 연산자 (11.13) 또는 PostfixExpression (11.3) 또는 Prefix Increment (11.4.4) 또는 Prefix Decrement (11.4.5) 연산자에 의해 운영되는 UnaryExpression의 LeftHandSideExpression으로 표시되지 않을 수 있습니다. . 엄격 모드 함수의 인수 개체는 액세스 할 때 TypeError 예외를 발생시키는 "caller"및 "callee"라는 구성 할 수없는 접근 자 속성을 정의합니다 (10.6).
  • 엄격 모드 함수의 인수 객체는 배열 인덱스 속성 값을 해당 함수의 해당 형식 매개 변수 바인딩과 동적으로 공유하지 않습니다. (10.6). 엄격 모드 함수의 경우, 인수 오브젝트가 작성되면 로컬 ID 인수를 인수 오브젝트에 바인딩하는 것은 변경 불가능하므로 지정 표현식의 대상이 아닐 수 있습니다. (10.5).
  • 엄격 모드 코드에 둘 이상의 데이터 특성 정의 (11.1.5)가있는 ObjectLiteral이 포함 된 경우 SyntaxError입니다. 식별자 "eval"또는 식별자 "arguments"가 엄격한 코드에 포함 된 PropertyAssignment의 PropertySetParameterList에서 식별자로 발생하거나 FunctionBody가 엄격한 코드 (11.1.5) 인 경우 SyntaxError입니다.
  • 엄격한 모드 평가 코드는 호출자의 변수 환경에서 변수 또는 함수를 평가할 수 없습니다. 대신 새 변수 환경이 작성되고 해당 환경이 평가 코드 (10.4.2)의 선언 바인딩 인스턴스화에 사용됩니다.
  • 이것이 엄격 모드 코드 내에서 평가되면이 값은 오브젝트로 강제되지 않습니다. 이 null 또는 undefined 값은 전역 객체로 변환되지 않으며 기본 값은 래퍼 객체로 변환되지 않습니다. 함수 호출 (Function.prototype.apply 및 Function.prototype.call을 사용한 호출 포함)을 통해 전달 된이 값은 전달 된이 값을 객체 (10.4.3, 11.1.1, 15.3.4.3, 15.3)로 강제하지 않습니다. 4.4).
  • 엄격 모드 코드 내에서 삭제 연산자가 발생하면 UnaryExpression이 변수, 함수 인수 또는 함수 이름 (11.4.1)에 대한 직접 참조 인 경우 SyntaxError가 발생합니다.
  • 엄격 모드 코드 내에서 삭제 연산자가 발생하면 삭제할 특성에 {[[Configurable]] : false} (11.4.1) 속성이있는 경우 TypeError가 발생합니다. VariableDeclaration 또는 VariableDeclarationNoIn이 엄격한 코드 내에서 발생하고 해당 식별자가 eval 또는 arguments (12.2.1) 인 경우 SyntaxError입니다.
  • 엄격한 모드 코드에는 WithStatement가 포함되지 않을 수 있습니다. 이러한 컨텍스트에서 WithStatement의 발생은 SyntaxError (12.10)입니다.
  • Catch가있는 TryStatement가 엄격한 코드 내에서 발생하고 Catch 프로덕션의 식별자가 eval 또는 인수 인 경우 SyntaxError입니다 (12.14.1).
  • 식별자 eval 또는 인수가 엄격한 모드 FunctionDeclaration 또는 FunctionExpression (13.1)의 FormalParameterList 내에 나타나는 경우 SyntaxError입니다.
  • 엄격 모드 기능에는 동일한 이름을 가진 둘 이상의 형식 매개 변수가 없을 수 있습니다. FunctionDeclaration, FunctionExpression 또는 Function 생성자를 사용하여 이러한 함수를 작성하려는 시도는 SyntaxError (13.1, 15.3.2)입니다.
  • 구현은이 명세서에 정의 된 것 이상으로 호출 자라는 속성의 엄격 모드 함수 또는 함수 인스턴스의 인수 내에서 확장되지 않을 수 있습니다. ECMAScript 코드는 엄격 모드 기능 (10.6, 13.2, 15.3.4.5.3)에 해당하는 함수 객체에서 이러한 이름의 속성을 만들거나 수정할 수 없습니다.
  • 엄격 모드 코드 내에서 식별자 eval 또는 인수를 FunctionDeclaration 또는 FunctionExpression의 식별자 또는 공식 매개 변수 이름 (13.1)으로 사용하는 것은 SyntaxError입니다. 함수 생성자 (15.3.2)를 사용하여 이러한 엄격한 모드 함수를 동적으로 정의하려고하면 SyntaxError 예외가 발생합니다.

6

ECMAScript 5는 엄격 모드 개념을 도입했습니다 .

코드에서 엄격한 모드 호출

엄격 모드는 전체 스크립트 또는 개별 기능에 적용됩니다. {} 중괄호로 묶인 블록 명령문에는 적용되지 않으며 이러한 컨텍스트에 적용하려고 시도해도 아무런 효과가 없습니다.

전체 스크립트 :

app.js를 생성한다고 가정하면 첫 번째 명령문 사용 스크립트를 추가하면 전체 코드에 대해 엄격한 모드가 적용됩니다.

// app.js whole script in strict mode syntax
use strict”;
// Now you can start writing your code 

기능에 대한 엄격한 모드 :

함수에 대해 엄격 모드를 호출하려면 "use strict"라는 정확한 문장을 넣으십시오. 다른 문장보다 함수 본문의 시작 부분에서.

function yourFunc(){
 "use strict";

 // Your function code logic
}

엄격 모드는 일반적인 Javascript 의미에 몇 가지 변경 사항을 통합합니다. 첫 번째 엄격 모드는 오류를 발생 시키도록 변경하여 일부 JavaScript 자동 오류를 제거합니다.

인스턴스의 경우 : 엄격한 모드를 사용하는 코드

여기에 이미지 설명을 입력하십시오

위의 코드 예제에서 코드에서 엄격 모드를 사용하지 않으면 오류가 발생하지 않습니다. 변수 x를 선언하지 않고 액세스 하고 있습니다. 따라서 엄격 모드에서는 선언되지 않은 변수에 액세스하면 오류가 발생합니다.

이제 엄격 모드없이 선언하지 않고 변수 x에 액세스 해 봅시다.

(function(){
    x = 3;
})();

// Will not throw an error

엄격 모드 사용의 장점 :

  • 오류를 발생시켜 JavaScript 자동 오류를 제거하십시오.
  • JavaScript 엔진이 최적화를 수행하기 어려운 실수를 수정합니다.
  • 엄격 모드가 아닌 동일한 코드보다 언젠가 코드를 더 빠르게 실행
  • 향후 ECMAScript 버전에서 정의 될 수있는 구문을 금지합니다.

5

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

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

  • 엄격 모드는 JavaScript 엔진이 최적화를 수행하기 어려운 실수를 수정합니다.

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


1

ECMAScript5몇 가지 새로운 객체 및 속성과 소위 소개 "strict mode"합니다.

엄격 모드는 더 이상 사용되지 않는 기능을 제외하는 언어의 하위 집합입니다. 엄격 모드는 옵트 인이며 필수는 아닙니다. 즉, 코드를 엄격 모드에서 실행하려면 다음 문자열을 사용하여 (함수마다 한 번 또는 전체 프로그램에 대해 한 번) 의도를 선언합니다.

"use strict";

1

2017과 마침내 설명서를 발견했습니다 :
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

엄격 모드는 제한된 JavaScript 변형을 선택하는 방법입니다. 엄격한 모드는 단순한 하위 집합이 아닙니다. 의도적으로 일반 코드와 다른 의미가 있습니다. 엄격 모드를 지원하지 않는 브라우저는 브라우저와 동작이 다른 엄격 모드 코드를 실행하므로 엄격 모드의 관련 측면을 지원하기 위해 기능 테스트없이 엄격 모드에 의존하지 마십시오. 엄격한 모드 코드와 엄격하지 않은 모드 코드가 공존 할 수 있으므로 스크립트가 엄격하게 엄격 모드를 선택할 수 있습니다.


엄격 모드는 일반적인 JavaScript 의미를 몇 가지 변경합니다. 첫째, 엄격 모드는 오류를 발생 시키도록 변경하여 일부 JavaScript 자동 오류를 제거합니다. 둘째, 엄격 모드는 JavaScript 엔진이 최적화를 수행하기 어려운 실수를 수정합니다. 엄격 모드 코드는 엄격 모드가 아닌 동일한 코드보다 더 빠르게 실행될 수 있습니다. 셋째, 엄격 모드는 향후 ECMAScript 버전에서 정의 될 수있는 구문을 금지합니다.


0

질문 :
다음은 내가 겪은 문제입니다. 튜토리얼을 따르고 있었고 다음 scss파일 을 컴파일 하고 CSS 코드를 생성하려고 시도했습니다.

.fatty{
  width: percentage(6/7);
}

다음 gulpfile.js작업을 사용하여 :

var gulp = require('gulp');
var sass = require('gulp-sass');

gulp.task('sass', function () {
    return gulp.src('app/scss/styles.scss')
        .pipe(sass())
        .pipe(gulp.dest('app/css'))
});

그래서 내가 얻는 오류는 다음과 같습니다.

~/htdocs/Learning/gulp1/node_modules/gulp-sass/index.js:66
    let sassMap;
    ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:373:25)
// stacktrace here...

해결책 : gulp-sass 모듈 안에있는 파일을
보여줍니다 index.js(기본적으로 잠겨 있으며 편집해서는 안됩니다). 그러나 강제로 가서 "use_strict"해당 index.js파일 의 맨 위에 추가하면 내 작업이 원활하게 실행됩니다.

나는 무력했기 때문에 이것을 해결책으로 계속 사용합니다! 그러나 다른 SO Q & A를 거친 후에 다음과 같은 대답보았습니다 .

sudo npm install -g n
sudo n stable

그리고 곧 NodeJ를 Version10.x로 업데이트 한 다음 터미널에서 지시 한대로 다음 명령을 실행하여 Gulp를 다시 작성했습니다.

npm rebuild node-sass --force

그리고 괜찮습니다. 그렇게 해결되었습니다. index.jsgulp 모듈 파일에 대한 변경 사항을 취소했습니다 . 이제는 원활하게 실행됩니다.

이 답변이 누군가에게 도움이되기를 바랍니다.

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