javascript reserved coding - 자바 스크립트에서 "엄격한 사용"이란 무엇이며 그 배후에있는 추론은 무엇입니까?





12 Answers

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

이것은 자바 스크립트 파일 (파일의 상단 또는 함수의 내부)에 다음과 같이 삽입 한 문자열입니다.

"use strict";

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

practice best practices

최근에 Crockford의 JSLint 통해 JavaScript 코드를 실행했는데 다음과 같은 오류가 발생했습니다.

문제 1 행 1 문자 : "엄격한 사용"문이 없습니다.

일부 검색을 수행하면 일부 사람들은 "use strict"; 추가한다는 사실을 깨달았습니다 "use strict"; JavaScript 코드로 변환합니다. 문을 추가하면 오류가 표시되지 않습니다. 불행히도 Google은이 문자열 문구 뒤에 숨겨진 많은 역사를 밝히지 않았습니다. 브라우저가 자바 스크립트를 해석하는 방법과 관련이있을 것입니다.하지만 그 효과가 무엇인지 전혀 알지 못합니다.

그렇다면 "use strict"; 이란 무엇입니까 "use strict"; 이 모든 것이 묵시적이며, 여전히 관련이 있습니까?

현재 브라우저 중 하나라도 "use strict"; 응답합니까 "use strict"; 문자열 또는 미래 사용을위한 것인가?




use strict 사용을 걱정하는 사람들은이 기사를 살펴 보는 것이 use strict .

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

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

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'; 갑자기 코드를 개선하지 않습니다.

JavaScript strict 모드ECMAScript 5 의 기능입니다. 엄격한 모드는 스크립트 / 함수 맨 위에 선언하여 활성화 할 수 있습니다.

'use strict';

자바 스크립트 엔진이이 지시어를 볼 때 특수 모드에서 코드를 해석하기 시작합니다. 이 모드에서는 잠재적 인 버그가 될 수있는 특정 코딩 방법이 감지 될 때 오류가 발생합니다 (엄격 모드의 추론 임).

다음 예제를 고려하십시오.

var a = 365;
var b = 030;

숫자 리터럴을 일렬로 늘어 놓기 위해 개발자는 부주의하게 변수 b 를 8 진수로 초기화했습니다. 비 엄격 모드는 이것을 숫자 리터럴 값 24 (10 진수)로 해석합니다. 그러나 엄격 모드에서는 오류가 발생합니다.

엄격 모드의 전문 분야에 대한 전체 목록은 이 답변을 참조하십시오.

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

  • JavaScript 응용 프로그램에서 : 물론입니다! Strict 모드는 코드로 무언가를 할 때 내부 고발자 (whistleblower)로 사용할 수 있습니다.

  • 기존 JavaScript 코드에서 : 아마도 아닙니다! 기존 JavaScript 코드에 strict 모드에서 금지 된 명령문이 있으면 응용 프로그램이 중단됩니다. 엄격 모드를 원할 경우 기존 코드를 디버그하고 수정할 준비가되어 있어야합니다. 이것이 'use strict'; 이유입니다 'use strict'; 갑자기 코드를 개선하지 않습니다 .

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

  1. 'use strict'; 삽입하십시오 'use strict'; 귀하의 스크립트 상단에 진술 :

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

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

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

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

    함수의 어휘 범위 에있는 모든 것은 엄격 모드로 해석 될 것입니다. 어휘 범위 는 여기에서 중요합니다. 더 자세한 설명은 이 답변 을 참조하십시오.

엄격 모드에서는 어떤 것들이 금지되어 있습니까?

엄격 모드에서 금지 된 몇 가지 사항을 설명하는 멋진 기사 를 발견했습니다 (독점 목록이 아님).

범위

역사적으로 JavaScript는 함수의 범위가 어떻게 달라 졌는지 혼란스러워했습니다. 때로는 정적으로 범위가 지정된 것처럼 보일 수도 있지만 일부 기능은 동적 범위와 같이 동작합니다. 혼란 스럽기 때문에 프로그램을 읽고 이해하기가 어렵습니다. 오해로 인해 버그가 발생합니다. 또한 성능에 문제가 있습니다. 정적 범위 지정은 컴파일 시간에 변수 바인딩을 허용하지만 동적 범위 요구 사항은 런타임에 바인딩을 연기해야한다는 것을 의미하며 이로 인해 성능이 크게 저하됩니다.

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

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

내포 된 전역 변수

JavaScript는 전역 변수를 암시합니다. 변수를 명시 적으로 선언하지 않으면 전역 변수가 내재적으로 선언됩니다. 이것은 기본적인 관리 작업을 간과 할 수 있기 때문에 프로그래밍을 초보자가 쉽게 할 수있게 해줍니다. 그러나 더 큰 프로그램의 관리가 훨씬 어려워지며 안정성이 크게 떨어집니다. 따라서 엄격 모드에서는 묵시적인 전역 변수가 더 이상 생성되지 않습니다. 모든 변수를 명시 적으로 선언해야합니다.

글로벌 누출

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

시끄러운 실패

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

8 진법

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

C에서는 매우 불행한 8 진수 표현이 선택되었습니다. 선행 0. 따라서 C에서 0100 은 100이 아니라 64를 의미하고 0808 이 아니라 오류입니다. 더욱 불행하게도이 시대 착오는 JavaScript를 포함하여 거의 모든 현대 언어에 복사되어 오류를 만드는 데에만 사용됩니다. 다른 용도는 없습니다. 따라서 엄격 모드에서는 8 진수 형식이 더 이상 허용되지 않습니다.

등등

인수 pseudo 배열은 ES5에서 조금 더 배열과 같습니다. strict 모드에서는 calleecaller 속성을 잃어 버립니다. 이렇게하면 많은 기밀 컨텍스트를 포기하지 않고 신뢰할 수없는 코드에 arguments 를 전달할 수 있습니다. 또한 함수의 arguments 속성이 제거되었습니다.

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

향후 자바 스크립트 버전 용 예약어

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

interface , package , private , protected , public , staticyield

더 읽을 거리




나는 다른 답을 보완하는 좀 더 기초적인 대답을 제시하고자한다. 가장 인기있는 답변을 편집하려고했지만 실패했습니다. 나는 그것을 가능한 한 포괄적이고 완벽하게 만들려고 노력했다.

자세한 내용은 MDN 설명서 를 참조하십시오.

ECMAScript 5에 도입 된 "use strict" 지침을 "use strict" 합니다.

지시어는 문장과 비슷하지만 아직 다릅니다.

  • use strict 는 키워드를 포함하지 않습니다. 지시어는 특수한 문자열 리터럴 (작은 따옴표 나 큰 따옴표)로 구성된 간단한 표현식 명령문입니다. ECMAScript 5를 구현하지 않는 JavaScript 엔진은 부작용이없는 표현식 문구 만 볼뿐입니다. ECMAScript 표준의 향후 버전에서는 실제 핵심어로 use 될 것으로 예상됩니다. 따옴표는 쓸모 없게 될 것이다.
  • use strict 는 스크립트 또는 함수의 시작 부분에서만 use strict 수 있습니다. 즉, 다른 모든 (실제) 문 앞에 와야합니다. 함수의 스크립트에서 첫 번째 명령 일 필요는 없습니다. 문자열 리터럴로 구성된 다른 명령문 표현식이 선행 될 수 있습니다 (JavaScript 구현은이를 구현 특정 지시어로 처리 할 수 ​​있습니다). 문자열 리터럴 문장은 (스크립트 또는 함수에서) 첫 번째 실제 문장 다음에 오는 간단한 표현 문입니다. 해석자는 지시어로 해석해서는 안되며 효과가 없습니다.

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

ECMAScript 5의 엄격 모드는 JavaScript 언어의 관련 하위 요소를 제거하고보다 엄격한 오류 검사와 높은 보안을 특징으로하는 JavaScript 언어의 제한된 하위 집합입니다. 엄격 모드와 일반 모드의 차이점은 다음과 같습니다 (그 중 처음 세 가지가 특히 중요합니다).

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

  • strict 모드에서는 읽기 전용 속성에 할당하거나 확장 가능하지 않은 객체에 대한 새 속성을 정의하려고 할 때 TypeError 가 발생합니다. (정상 모드에서는 오류 메시지없이 간단히 실패합니다.)

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



작년에 출시 된 브라우저를 사용하는 경우 자바 스크립트 엄격 모드를 지원할 가능성이 큽니다. ECMAScript 5가 현재 표준이 된 이전 브라우저 만 지원하지 않습니다.

명령 주위의 따옴표는 엄격한 모드에서 구문 오류를 생성하는 것들이 일반적으로 오래된 브라우저에서 일부 어려운 방법으로 스크립트가 오작동을 일으킬지라도 코드가 구형 브라우저에서도 여전히 작동하는지 확인합니다.




"use strict"; 추가 할 때 "use strict"; , 다음과 같은 경우 스크립트가 실행되기 전에 SyntaxError 가 throw됩니다.

  • 새롭게 예약 된 키워드 중 하나를 사용하여 미래의 ECMAScript 버전을위한 길을 닦으십시오 ( ECMAScript 6의 사전 판에서 ) : implements , interface , let , package , private , protected , public , staticyield .

  • 함수를 블록으로 선언

    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에서 더 이상 발생하지 않습니다 ( bug 1041128 ).

  • 동일한 이름 함수를 갖는 두 개의 함수 인수 선언

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

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

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

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

출처 :




포함 use strict이 시점에서 모든 민감한 자바 스크립트 파일의 시작 부분에서하는 것은 더 나은 자바 스크립트 프로그래머가 될 글로벌 해지고 상황이 자동으로 변경 확률 변수를 피하기 위해 작은 방법입니다.




ECMAScript위원회에 참여한 일부 사람들은 "JavaScript 에 대한 변경 사항, 1 부 : ECMAScript 5" 라는 "use strict"스위치를 사용하여 JavaScript 구현자가 JavaScript의 위험한 기능을 갑자기 모든 웹 사이트를 중단시키지 않고 어떻게 정리할 수 있는지에 대해 이야기합니다. 세상에.

물론 ECMAScript 5가 어떻게 수정했는지에 대해서도 이야기하고 있습니다.




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

다음은 ES6ES7 에서 엄격 모드 실행 조건입니다 .

  • 글로벌 코드는 Strict Directive (14.1.1 참조)가 포함 된 Directive Prologue로 시작하는 경우 엄격한 모드 코드입니다.
  • 모듈 코드는 항상 엄격한 모드 코드입니다.
  • ClassDeclaration 또는 ClassExpression 의 모든 부분 은 엄격한 모드 코드입니다.
  • Eval code는 Strict Directive를 포함하는 Directive Prologue로 시작하거나 eval에 대한 호출이 Strict Mode 코드에 포함 된 직접 평가 (12.3.4.1 참조) 인 경우 엄격한 모드 코드입니다.
  • 함수 코드는 연관된 FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition 또는 ArrowFunction 이 엄격 모드 코드에 포함되어 있거나 함수의 [[ECMAScriptCode]] 내부 슬롯의 값을 생성하는 코드가 Directive Prologue로 시작하는 경우 엄격 모드 코드입니다 여기에는 Use Strict Directive가 포함되어 있습니다.
  • 마지막 인수가 Useful Strict 지시어가 포함 된 Directive Prologue로 시작 하는 FunctionBody 인 String 인 경우 내장 된 Function 및 Generator 생성자에 대한 인수로 제공되는 함수 코드는 엄격한 모드 코드 입니다.



개발자가 사용해야하는 주된 이유 "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. 키워드 사용을 변수로 제한합니다. 그들을 사용하려고하면 오류가 발생합니다.

짧게하면 코드 오류가 발생하기 어렵게되고 차례로 좋은 코드를 작성하게됩니다.

그것에 대해 더 자세히 읽으려면 여기 를 참조 하십시오 .




"엄격한 사용"; JavaScript를 좀 더 강력하게 만드는 ECMA 노력입니다. 그것은 JS에서 최소한 "엄격한"(다른 언어는 90 년대 이래로 엄격한 규칙을 구현합니다) 시도를 시도합니다. 실제로 JavaScript 개발자는 일종의 코딩 모범 사례를 따르도록 "강요"합니다. 여전히 JavaScript는 매우 약합니다. 유형이 지정된 변수, 유형이 지정된 메소드 등은 없습니다. 자바 스크립트 개발자는 Java 또는 ActionScript3와 같은보다 견고한 언어를 배우고 JavaScript 코드에서 동일한 모범 사례를 구현할 것을 강력히 권장합니다. 더 잘 작동하고 더 쉬워집니다. 디버그.




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

if "use strict"가 사용되면 코드는 엄격한 규칙을 따르고 오류 및 모호한 가능성을 줄여 작성해야합니다.




Related