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


Answers

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

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

"use strict";

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

Question

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

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

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

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

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




Normally java script does not follow strict rules hence increasing chances of errors. After using "use strict" , the java script code should follow strict set of rules as like in other programming languages such as use of terminators, declaration before initialization etc.

If "use strict" is used then the code should be written by following a strict set of rules hence decreasing the chances of errors and ambiguities.




'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

더 읽을 거리




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

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




The main reasons why developers should use "use strict" are:

  1. Prevents accidental declaration of global variables.Using "use strict()" will make sure that variables are declared with var before use. 예 :

    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: The "use strict" directive is only recognized at the beginning of a script or a function.
  3. The string "arguments" cannot be used as a variable:

    "use strict";
    var arguments = 3.14;    // This will cause an error
    
  4. Will restrict uses of keywords as variables. Trying to use them will throw errors.

In short will make your code less error prone and in turn will make you write good code.

To read more about it you can refer http://www.w3schools.com/js/js_strict.asp .




There's a good talk by some people who were on the ECMAScript committee: Changes to JavaScript, Part 1: ECMAScript 5" about how incremental use of the "use strict" switch allows JavaScript implementers to clean up a lot of the dangerous features of JavaScript without suddenly breaking every website in the world.

Of course it also talks about just what a lot of those misfeatures are (were) and how ECMAScript 5 fixes them.




When adding "use strict"; , the following cases will throw a SyntaxError before the script is executing:

  • Paving the way for future ECMAScript versions , using one of the newly reserved keywords (in prevision for ECMAScript 6 ): implements , interface , let , package , private , protected , public , static , and yield .

  • Declaring function in blocks

    if(a<b){ function f(){} }
    
  • Octal syntax

    var n = 023;
    
  • this point to the global object.

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
    
  • Declaring twice the same name for a property name in an object literal

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

    This is no longer the case in ECMAScript 6 ( bug 1041128 ).

  • Declaring two function arguments with the same name function

    f(a, b, b){}
    
  • Setting a value to an undeclared variable

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
    
  • Using delete on a variable name delete myVariable;

  • Using eval or arguments as variable or function argument name

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

출처 :




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

자세한 내용은 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 발생시킵니다.



Just wanted to add some more points.

The Reason to Use Strict Mode--->

  • Strict mode makes it easier to write "secure" JavaScript.

  • Strict mode changes previously accepted "bad syntax" into real
    오류.

  • As an example, in normal JavaScript, mistyping a variable name
    creates a new global variable.

  • In strict mode, this will throw an error, making it impossible to accidentally create a global variable.

  • In strict mode, any assignment to a non-writable property, a
    getter-only property, a non-existing property, a non-existing
    variable, or a non-existing object, will throw an error.

The things that will throw errors in Strict Mode Using a variable, without declaring it, is not allowed:

"use strict";
 x = 3.14;                // This will cause an error

Objects are variables too.

Using an object, without declaring it, is not allowed:

  "use strict";
  x = {p1:10, p2:20};      // This will cause an error

Deleting a variable (or object) is not allowed.

  "use strict";
   var x = 3.14;
   delete x;                // This will cause an error

For security reasons, eval() is not allowed to create variables in the scope from which it was called:

"use strict";
 eval ("var x = 2");
 alert (x);               // This will cause an error

f ()와 같은 함수 호출에서이 값은 전역 객체였습니다. 엄격 모드에서는 이제 정의되지 않았습니다.

"엄격한 사용"은 스크립트 시작 부분에서만 인식됩니다.




Note that use strict was introduced in EcmaScript 5 and was kept since then.

Below are the conditions to trigger strict mode in ES6 and ES7 :

  • Global code is strict mode code if it begins with a Directive Prologue that contains a Use Strict Directive (see 14.1.1).
  • Module code is always strict mode code.
  • All parts of a ClassDeclaration or a ClassExpression are strict mode code.
  • Eval code is strict mode code if it begins with a Directive Prologue that contains a Use Strict Directive or if the call to eval is a direct eval (see 12.3.4.1) that is contained in strict mode code.
  • Function code is strict mode code if the associated FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition, or ArrowFunction is contained in strict mode code or if the code that produces the value of the function's [[ECMAScriptCode]] internal slot begins with a Directive Prologue that contains a Use Strict Directive.
  • Function code that is supplied as the arguments to the built-in Function and Generator constructors is strict mode code if the last argument is a String that when processed is a FunctionBody that begins with a Directive Prologue that contains a Use Strict Directive.



"use strict"; is the ECMA effort to make JavaScript a little bit more robust. It brings in JS an attempt to make it at least a little "strict" (other languages implement strict rules since the 90s). It actually "forces" JavaScript developers to follow some sort of coding best practices. Still, JavaScript is very fragile. There is no such thing as typed variables, typed methods, etc. I strongly recommend JavaScript developers to learn a more robust language such as Java or ActionScript3, and implement the same best practices in your JavaScript code, it will work better and be easier to debug.




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



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

눈금자를 사용하지 않으려는 사람들은 일반적으로 다른 사람들이 코드를 디버깅하도록 요청하는 페이지에서 끝납니다.

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

최신 자바 스크립트 실습은 항상 "엄격한 사용"을 불러 일으켜야합니다. 프라그마. ECMA Group이 "엄격한"모드를 선택 사항으로 만들었던 유일한 이유는 경험이 부족한 코더가 JavaScript에 액세스 할 수있게하고 새롭고 안전한 코딩 방법에 적응할 시간을주는 것입니다.




Related