source

JavaScript에서 "엄격한 사용"은 무엇을 하며, 그 배경은 무엇입니까?

itover 2022. 11. 22. 21:31
반응형

JavaScript에서 "엄격한 사용"은 무엇을 하며, 그 배경은 무엇입니까?

최근에 Crockford의 JSLint에서 JavaScript 코드 중 일부를 실행했더니 다음과 같은 오류가 발생했습니다.

1행의 문제 문자 1: "use strict" 문이 없습니다.

, 어떤 은 더 많이 하는 것 요."use strict";자바스크립트스테이트먼트를 추가하자 에러가 표시되지 않게 되었습니다.안타깝게도 구글은 이 문자열 성명 뒤에 숨겨진 많은 역사를 밝히지 않았다.브라우저에 의한 JavaScript의 해석과 관계가 있는 것은 틀림없습니다만, 그 효과는 전혀 알 수 없습니다.

ㅇㅇㅇㅇ가 죠?"use strict";어떤 의미인지, 그리고 여전히 관련이 있을까요?

중 라도 "응대"에 ?"use strict";스트링입니까, 아니면 나중에 사용할 건가요?

ES6 모듈 업데이트

네이티브 ECMAScript 모듈(및 문 포함) 및 ES6 클래스에서는 strict 모드는 항상 이니블이며 디세블로 할 수 없습니다.

원답

Javascript Strict Mode에 대한 이 기사는 John Resig - ECMAScript 5 Strict Mode, JSON 및 기타 정보를 참조하십시오.

몇 가지 흥미로운 부분을 인용하면:

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

그리고:

strict 모드는 다음 두 가지 방법으로 도움이 됩니다.

  • 일반적인 코딩 오류를 포착하여 예외를 발생시킵니다.
  • 비교적 "안전하지 않은" 액션(글로벌오브젝트에 대한 접근권 획득 등)이 실행되는 것을 방지하거나 오류를 발생시킵니다.
  • 혼란스럽거나 충분히 고려되지 않은 기능은 비활성화됩니다.

또, 파일 전체에 「엄격한 모드」를 적용할 수도 있습니다.또는 특정 기능에 대해서만 사용할 수 있습니다(John Resig의 기사에서 인용).

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code...

오래된 코드와 새로운 코드를 혼재시킬 필요가 있는 경우 도움이 될 수 있습니다;-)

그래서 Perl에서 사용할 수 있는 것과 비슷하다고 생각합니다(그래서 이름이 붙었습니까?): 파손의 원인이 될 수 있는 것을 더 많이 검출함으로써 오류를 줄일 수 있습니다.

이제 모든 주요 브라우저에서 strict 모드가 지원됩니다.

ECMAScript 5의 신기능입니다.존 레식은 그것에 대한 멋진 요약을 썼다.

이것은 JavaScript 파일(파일 맨 위 또는 함수 내부)에 넣는 문자열일 뿐입니다.

"use strict";

현재 코드에 입력해도 문자열이기 때문에 현재 브라우저에서는 문제가 발생하지 않습니다.나중에 코드가 플러그마를 위반할 경우 코드에 문제가 발생할 수 있습니다.를 들어, 를를,가 있는 경우 음음음음 for for for for for for for forfoo = "bar"「」을 정의하지 않고,foo먼,,,코코..........................................네.

문장은 '이이 the the the 。"use strict"; 는 JavaScript의 축소된 안전한 기능 세트인 Strict 모드를 사용하도록 브라우저에 지시합니다.

기능 목록(비유출)

  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;일부 dev는 앞의 0이 번호를 변경하지 않는다고 잘못 가정합니다.)

  7. 합니다.with(키워드)

  8. eval에서는 새로운 strict는 .

  9. ( 플레인 네임 삭제 금지)delete x;)

  10. 또는 합니다.eval ★★★★★★★★★★★★★★★★★」arguments 형태로든

  11. strict 는 strict의 .arguments(예: (에)function sum (a,b) { return arguments[0] + b;} 것은 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다.'arguments[0] 속박되어 있다a등). (차이에 대해서는 다음 항을 참조해 주세요.)

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

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


예:

  1. 엄밀한 모드 코드는 코드 내에서 생성된 인수 개체의 속성에 별칭을 지정하지 않습니다.
function show( msg ){
    msg = 42;
    console.log( msg );          // msg === 42
    console.log( arguments[0] ); // arguments === 42
}
show( "Hey" );

// In strict mode arguments[i] does not track the value of 
// the corresponding named argument, nor does a named argument track the value in the corresponding arguments[i]
function showStrict( msg ){
    "use strict";
    msg = 42;
    console.log( msg );          // msg === 42
    console.log( arguments[0] ); // arguments === "Hey"
}
showStrict( "Hey" );

이 사용법을 걱정한다면use strict해 볼 것 같습니다.

ECMAScript 5의 브라우저 'Strict 모드' 지원이것은 무엇을 의미합니까?
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.
*/

: '적용하다', '적용하다', '적용하다: '적용하다'"use strict"위험해질 수 있습니다!이것은 코드를 붙여 '더 좋게' 만들 수 있는 기분 좋고 행복한 얼굴의 스티커가 아닙니다."use strict"pragma, 브라우저는 단지 그 지점에서 자바스크립트가 행복하게 허용되지만 엄격한 자바스크립트를 폐지하는 것을 하고 있기 때문에 이전에 결코 던지지 않았던 랜덤한 장소에서 갑자기 예외를 던집니다.코드에 거의 사용되지 않는 콜에 엄격성 위반이 숨겨져 있을 수 있습니다.이 경우, 예를 들어 유료 고객이 사용하는 실가동 환경에서만 예외가 발생합니다.

과감하게 도전할 에는 '어느 정도'나 '어느 정도'를 것 같아요."use strict"또한 포괄적인 유닛 테스트와 엄밀하게 구성된 JSHint 빌드 태스크도 포함되어 있습니다.이를 통해 엄밀한 모드를 켰다고 해서 모듈의 어두운 모서리가 심하게 터지는 일은 없다는 확신을 얻을 수 있습니다.또 선택지가 그냥 , 하다, 하다, 하다, 하지 ."use strict"그렇게 하는 게 더 안전할 거야,절대 추가하지 마세요"use strict"서드파티 모듈 등 소유 또는 유지보수가 없는 모듈로 이동합니다.

에 갇힌 "use strict"좋은 일이 될 수 있지만, 제대로 해야 합니다.엄격해져야 할 가장 좋은 시기는 프로젝트가 미개척 상태이고 처음부터 다시 시작해야 할 때입니다.JSHint/JSLint팀이 견딜 수 있는 한 모든 경고와 옵션을 강화하여 다음과 같은 훌륭한 빌드/테스트/프로세서 시스템을 구축하십시오.Grunt+Karma+Chai 새 '보다 낫다'로하기 시작합니다"use strict"사소한 오류와 경고를 많이 고칠 수 있도록 준비합니다.「FAIL」의 경우, 해, 모든 합니다.JSHint/JSLint을 사용하다

는 내가 했을 때 그린필드 가 아니었다."use strict", IDE가 찼습니다."use strict"JSHint j j j j j j j j j j j 。리팩터링은 앞으로 어떻게 해야 할지 상기시켜 주는 것입니다.입니다."use strict"몇 년이나 지났어요

「」를 사용합니다.'use strict';이치노

JavaScript strict 모드는 ECMAScript 5의 기능입니다.스크립트/함수 상단에서 이를 선언함으로써 strict 모드를 이노블로 할 수 있습니다.

'use strict';

JavaScript 엔진은 디렉티브를 인식하면 특수 모드로 코드를 해석하기 시작합니다.이 모드에서는 잠재적인 버그가 될 가능성이 있는 특정 코딩 관행이 검출되면 오류가 발생합니다(이것은 엄밀한 모드의 배후에 있는 이유입니다).

다음 예를 생각해 보겠습니다.

var a = 365;
var b = 030;

는 숫자 in 는 、 는 、 는 、 는 、 는 、 in 、 in 、 in in 。b여덟 살하지 않은 에서는, 을 값 「」을 합니다.24(10시)를 발생시키고 strict 모드는 에러를 시킵니다.

strict 모드의 스페셜리티의 비소진 리스트에 대해서는, 다음의 회답을 참조해 주세요.


다 쓰면 요?'use strict';

  • 새로운 JavaScript 어플리케이션:당연하지!Strict 모드는 코드를 가지고 바보 같은 짓을 할 때 내부고발자로 사용될 수 있습니다.

  • 기존 JavaScript 코드: 아마 아닐 거예요!기존 JavaScript 코드에 statement가 strict-mode로 금지되어 있는 경우 응용 프로그램은 단순히 중단됩니다.strict 모드를 사용하는 경우 기존 코드를 디버깅하고 수정할 준비가 되어 있어야 합니다.이것이 바로 사용해도 코드가 갑자기 개선되지 않는 이유입니다.


strict 모드 사용방법

  1. insert insert insert insert insert insert를 .'use strict';「 」 、 「 」

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

    은, 「」라고 하는 것에 해 주세요.myscript.js는 엄밀한 모드로 해석됩니다.

  2. '아까다'를 .'use strict';기능 본문 위에 다음 문구를 표시합니다.

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

    어휘적 기능 범위 내의 모든 것doSomething는 엄밀한 모드로 해석됩니다.여기서 어휘 범위라는 단어는 중요하다.예를 들어 엄밀한 코드가 엄밀하지 않은 라이브러리의 함수를 호출하는 경우 코드만 엄밀한 모드로 실행되며 호출된 함수는 실행되지 않습니다.자세한 설명은 이 답변을 참조하십시오.


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

strict 모드에서는 금지되어 있는 몇 가지 사항을 설명하는 좋은 기사를 찾았습니다(이것은 완전한 리스트는 아닙니다).

범위

지금까지 JavaScript는 함수의 범위 지정 방법에 대해 혼란스러웠습니다.경우에 따라서는 정적으로 범위가 지정되는 것처럼 보이지만 일부 기능에서는 동적으로 범위가 지정되는 것처럼 동작합니다.이것은 혼란스럽고 프로그램을 읽고 이해하기 어렵게 만든다.오해는 버그를 일으킨다.퍼포먼스에도 문제가 있습니다.정적 범위를 지정하면 컴파일 시 변수 바인딩이 발생할 수 있지만 동적 범위 요건에 따라 바인딩이 런타임으로 지연되어야 하므로 상당한 성능 저하가 발생합니다.

strict 모드에서는 모든 변수바인딩을 스태틱하게 실행해야 합니다.즉, 이전에 다이내믹바인딩이 필요했던 기능을 삭제 또는 변경해야 합니다.구체적으로는 with 스테이트먼트가 삭제되고 eval 함수의 발신자 환경 조작 기능이 대폭 제한됩니다.

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

잠재 글로벌 변수

JavaScript는 글로벌 변수를 암시하고 있습니다.변수를 명시적으로 선언하지 않으면 글로벌 변수가 암묵적으로 선언됩니다.이것은 초보자들이 기본적인 집안일을 소홀히 할 수 있기 때문에 프로그래밍을 더 쉽게 만든다.그러나 대규모 프로그램 관리가 훨씬 더 어려워지고 신뢰성이 크게 저하됩니다.따라서 strict 모드에서는 암묵적인 글로벌 변수가 생성되지 않습니다.모든 변수를 명시적으로 선언해야 합니다.

글로벌 리크

.this이치노를 들어, 「」의 는, 「」를 참조해 주세요.new함수를 때, 의 '컨스트럭터', '컨스트럭터'가 됩니다.this는 예기치 않게 글로벌오브젝트에 바인드 되기 때문에 새로운 오브젝트를 초기화하지 않고 글로벌 변수를 사일런트하게 변경합니다.가 strict로 .this로로 합니다.undefined그러면 컨스트럭터가 예외를 발생시켜 오류를 훨씬 더 빨리 검출할 수 있습니다.

노이즈가 많은 장애

전용을 가지고 JavaScript가 ES5가 될 가 직접 수 .Object.createProperty함수가 그 기능을 노출시켰습니다.읽기 전용 속성에 값을 할당하려고 하면 자동으로 실패합니다.할당에 따라 속성 값이 변경되지 않지만 프로그램은 변경된 것처럼 진행됩니다.이는 프로그램이 일관성 없는 상태가 될 수 있는 무결성 위험입니다.strict가 .

옥탈

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

C에서는 매우 유감스러운 8진수 표현이 선택되었습니다.. C는 C로, C는 C가 됩니다.0100 64, 100이 아니라 64를 합니다.08 8.이 아닙니다.더욱 불행하게도, 이러한 시대착오적인 것은 오직 오류를 만드는 데만 사용되는 자바스크립트를 포함한 거의 모든 현대 언어로 복사되었다.그것은 다른 목적이 없다.따라서 strict 모드에서는 8진수 형식은 사용할 수 없습니다.

엣세테라

ES5 의 유사 배열입니다. 「」, 「」가 없어집니다.callee ★★★★★★★★★★★★★★★★★」caller이렇게 합격할 수 .arguments신뢰할 수 없는 코드로 이행할 수 있습니다. ,,arguments함수의 속성이 제거됩니다.

구문 합니다.strict 드 in in 、 in in in in in 。함수는 이름이 같은 두 개의 매개 변수를 가질 수 없습니다.함수는 매개 변수 중 하나와 이름이 같은 변수를 가질 수 없습니다.는 할 수 delete자체 변수입니다.「」의.delete변경할 수 없는 속성이 예외를 발생시킵니다.기본 값은 암묵적으로 래핑되지 않습니다.


향후 JavaScript 버전을 위해 예약된 단어

ECMAScript 5는 예약된 단어 목록을 추가합니다.변수 또는 인수로 사용할 경우 strict 모드에서는 오류가 발생합니다.예약된 단어는 다음과 같습니다.

implements,interface,let,package,private,protected,public,static , , , , 입니다.yield


상세 정보

모든 개발자는 지금 바로 strict 모드를 사용할 것을 강력히 권장합니다.엄밀한 모드가 당신의 코드에 있는 줄도 몰랐던 오류로부터 우리를 구하는데 합법적으로 도움이 된다는 것을 지원하는 브라우저가 충분히 있습니다.

초기 단계에서는 지금까지 없었던 오류가 발생할 것 같습니다.모든 이점을 얻으려면 strict 모드로 전환한 후 적절한 테스트를 수행하여 모든 것을 파악해야 합니다. 그냥 는 않아요.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 경우 엄밀한 코드가 포함되어 있는 경우 엄밀됩니다.use strict★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★eval() 경우 메서드는 됩니다.eval() 、 the the the the the the the the the the the the 가 포함되어 있습니다.use strict명령어 자체입니다.

ECMAScript 5의 strict 모드는 JavaScript 언어의 제한된 서브셋으로 언어의 관련 결함을 제거하고 보다 엄격한 오류 검사와 높은 보안을 특징으로 합니다.다음으로 strict 모드와 normal 모드의 차이점을 나타냅니다(이 중 처음 3개는 특히 중요합니다).

  • 하실 수 없습니다.with mode statement in strict mode.
  • 파라미터, 또는 strict의 입니다.변수, 함수, 함수 파라미터, catch-clause 파라미터 또는 글로벌 속성으로 선언되지 않은 식별자에 값을 할당하는 경우Object, 그러면 당신은 그것을 얻을 것이다.ReferenceError. 는 글로벌 의으로서 암묵적으로 Object)
  • strict가 strict로 됩니다.thisundefined 모드(노멀 모드)this Object는 구현이 할 수 .strict 모드는 strict 모드입니다.
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • , 가 「」와 .call() ★★★★★★★★★★★★★★★★★」apply에서는, 「」를 해 주세요.this의 첫 번째 인수의 값입니다.call() ★★★★★★★★★★★★★★★★★」apply()( 모드일 경우)null ★★★★★★★★★★★★★★★★★」undefined Object을 사용하다

  • 에서는 strict " " 가 .TypeError 둘 다(통상 모드에서는 둘 다 에러 메시지 없이 실패합니다).

  • 에서는 strict에 를 eval()발신자의 범위내에서 변수 또는 함수를 선언 또는 정의할 수 없습니다(통상 모드에서는 할 수 있습니다).새로운 됩니다.eval()을 사용하다는 그음음음 that that음음음 that that that that that 。eval()을 사용하다
  • strict 모드에서는 함수의 arguments-object에는 해당 함수에 전달되는 값의 정적 복사가 포함됩니다.일반 모드에서는 arguments-object에 다소 "마법의" 동작이 있습니다.배열의 요소와 명명된 함수 매개 변수는 모두 동일한 값을 참조합니다.
  • 에서는 strict " " 가 .SyntaxErrordelete연산자 뒤에 정규화되지 않은 식별자(변수, 함수 또는 함수 파라미터)가 나옵니다.에서는, 「」가 .delete은 아무 도 하지 됩니다.false.
  • 에서는 strict " " 가 .TypeError하려고 할 모드에서는 하여 """ ("")가 됩니다.delete은 " "로 평가됩니다.false를 참조해 주세요.
  • strict 모드에서는 오브젝트 리터럴에 같은 이름의 속성을 여러 개 정의하려고 하면 구문 오류로 간주됩니다(통상 모드에서는 오류가 없습니다).
  • strict 모드에서는 함수 선언에 같은 이름의 파라미터가 여러 개 있는 경우 구문 오류로 간주됩니다.(통상 모드에서는 에러는 없습니다).
  • 되지 않습니다(입니다).0x(일반 모드에서는 일부 구현에서는 8진수 리터럴을 사용할 수 있습니다.
  • 는 strict " " 입니다.eval ★★★★★★★★★★★★★★★★★」arguments키워드처럼 취급됩니다.값을 변경할 수 없고 값을 할당할 수 없으며 변수, 함수, 함수 매개 변수 또는 캐치 블록 식별자의 이름으로 사용할 수 없습니다.
  • strict의 검사 됩니다. arguments.caller ★★★★★★★★★★★★★★★★★」arguments.callee를 빚다TypeError엄밀한 모드로 기능합니다.의 일부 및으로 인해 caller- 인수 "가 합니다.TypeError읽으려고 하면요.

내 의견:

중 는 문제를보다 수 입니다.strict 모드의 목적은 문제를 보다 빠르게 디버깅하는 것입니다.웹 페이지의 사일런트나 이상한 동작을 일으킬 수 있는 잘못된 일이 발생했을 때 예외를 두는 것으로 개발자에게 도움이 됩니다.★★★★★★★★★★★★★★★★★★★★★를 사용하는 순간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이치노

수집되지 않은 참조 오류: nameoftree가 정의되지 않았습니다.

Sample

with 이 명령어:

withuglify-module과 같은 도구를 사용하여 문장을 최소화할 수 없습니다.또한 향후 JavaScript 버전에서는 더 이상 사용되지 않으며 제거됩니다.

Sample

중복 방지:

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

Uncaughed SyntaxError: 개체 리터럴의 중복 데이터 속성은 엄격한 모드에서 허용되지 않습니다.

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

몇 개 더 있지만 나는 그것에 대해 더 많은 지식을 얻어야 한다.

작년에 출시된 브라우저를 사용하는 경우 대부분 JavaScript Strict 모드를 지원합니다.ECMAScript 5가 현재 표준이 되기 전의 오래된 브라우저만 지원되지 않습니다.

명령어 주위에 따옴표를 붙이면 코드가 오래된 브라우저에서도 동작하고 있음을 확인할 수 있습니다(단, 일반적으로 strict 모드에서 구문 오류를 발생시키는 것은 오래된 브라우저에서는 검출하기 어려운 방법으로 스크립트가 오작동하는 원인이 됩니다).

" " 를 할 "use strict";다음 경우 스크립트가 실행되기 전에 SyntaxError가 느려집니다.

  • 새로 예약된 키워드 중 하나를 사용하여 향후 ECMAScript 버전을 위한 길을 닦습니다(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();
    
  • 「」를 사용합니다.deletedelete myVariable;

  • 「」를 사용합니다.eval ★★★★★★★★★★★★★★★★★」arguments 인수 name으로 합니다.

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

출처:

strict 모드에서는 일반 JavaScript 시멘틱이 다음과 같이 변경됩니다.

  • 는 JavaScript 사일런트오류를 슬로우 에러로 변경함으로써 일부 사일런트오류를 배제합니다.

  • 오류를 수정하여 JavaScript 엔진의 최적화를 어렵게 합니다.

  • 그럼 ECMAScript의 향후 버전에서 정의될 가능성이 있는 구문을 금지합니다.

자세한 내용은 vistit Strict Mode - Javascript

"Use Strict"는 프로그래머가 JavaScript의 느슨하거나 나쁜 속성을 사용하지 않는 보험입니다.그것은 마치 자로 직선을 만들 수 있는 것처럼 안내서이다.Use Strict는 스트레이트 코딩에 도움이 됩니다.

행의 스트레이트에 룰자를 사용하지 않는 경우는, 통상은 다른 사람에게 코드의 디버깅을 요구하는 페이지가 표시됩니다.

믿어줘.설계 불량 코드에 비해 오버헤드는 무시할 수 있습니다.수년간 JavaScript 수석 개발자로 재직해 온 Doug Crockford의 흥미로운 게시물이 여기에 있습니다.개인적으로, 저는 항상 그의 사이트에 방문하여 저의 좋은 관행을 잊지 않도록 하고 싶습니다.

현대의 JavaScript 프랙티스는 항상 "Use Strict" 즉, 플러그마를 불러와야 합니다.ECMA Group이 "Strict" 모드를 옵션으로 설정한 유일한 이유는 경험이 적은 코더들이 JavaScript에 접근할 수 있도록 허용하고 새롭고 안전한 코딩 관행에 적응할 수 있는 시간을 주기 위해서입니다.

<<고객명>>님 포함use strict이 시점부터의 모든 중요한 자바스크립트 파일의 시작은 더 나은 자바스크립트 프로그래머가 되기 위한 작은 방법이며 랜덤 변수가 글로벌해지고 모든 것이 사일런트하게 변하는 것을 방지합니다.

w3schools에서 인용:

「엄격한 사용」지침

"use strict" 명령어는 JavaScript 1.8.5(ECMAScript 버전 5)에 새롭게 추가되었습니다.

이것은 문이 아니라 리터럴 표현이며 이전 버전의 JavaScript에서는 무시됩니다.

"use strict"의 목적은 코드가 "strict 모드"에서 실행되어야 함을 나타내는 것입니다.

strict 모드에서는 예를 들어 선언되지 않은 변수를 사용할 수 없습니다.

왜 엄격한 모드인가?

strict 모드를 사용하면 "보안" JavaScript를 쉽게 쓸 수 있습니다.

strict 모드에서는 이전에 받아들여졌던 "bad 구문"이 실제 오류로 변경됩니다.

예를 들어 일반 JavaScript에서는 변수 이름을 잘못 입력하면 새로운 글로벌 변수가 생성됩니다.strict 모드에서는 에러가 발생하므로 실수로 글로벌 변수를 작성할 수 없습니다.

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

strict 모드에서는 쓰기 불가능한 속성, getter 전용 속성, 존재하지 않는 속성, 존재하지 않는 변수 또는 존재하지 않는 개체에 할당하면 오류가 발생합니다.

자세한 것은, http://www.w3schools.com/js/js_strict.asp 를 참조해 주세요.

"use strict"는 JavaScript 코드를 엄밀한 모드로 실행합니다.이는 기본적으로 사용하기 전에 모든 것을 정의해야 함을 의미합니다.strict 모드를 사용하는 주된 이유는 정의되지 않은 메서드의 우발적인 글로벌 사용을 피하기 위해서입니다.

또한 strict 모드에서는 실행 속도가 빨라지고 일부 경고 또는 사일런트 경고는 치명적인 오류를 발생시키므로 항상 이를 사용하여 더 깔끔한 코드를 만드는 것이 좋습니다.

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

MDN의 다음 설명과 예를 참조하십시오.

strict
"use strict" JavaScript 1.8.5(ECMAScript 5)를 사용합니다.이것은 문이 아니라 리터럴 표현이며 이전 버전의 JavaScript에서는 무시됩니다.엄하게 사용하다모드에서는 variablesstrict는 할 수

strict: use strict 사용:
함수의 strict 모드: 마찬가지로 함수의 strict 모드를 호출하려면 함수의 본문에 "use strict"; (또는 "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에 대한 자세한 내용은 참조하십시오.

ECMAScript 위원회의 일부 인사들은 다음과 같은 좋은 이야기를 한다.JavaScript에 대한 변경, Part 1: ECMAScript 5"사용하여,"use strict"하면 JavaScript 는 전 모든 할 수 .switch는 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 strictEcmaScript 5에 도입되어 그 이후로 유지되고 있습니다.

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

  • 글로벌 코드는 Use Strict Directive가 포함된 Directive Prologue로 시작하는 경우 strict 모드코드입니다(14.1.1 참조).
  • 모듈 코드는 항상 엄밀한 모드코드입니다
  • ClassDeclaration 또는 ClassExpression의 모든 부분은 엄밀한 모드코드입니다
  • 평가 코드는 Use Strict Directive가 포함된 Directive Prologue로 시작되거나 평가 콜이 strict 모드코드에 포함된 직접 평가(12.3.4.1 참조)인 경우 strict 모드코드입니다
  • 함수 코드는 관련된 FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition 또는 ArrowFunction이 엄밀한 모드코드에 포함되어 있거나 함수의 [ECMAScriptCode] 내부 슬롯에 Strue가 포함된 DirectiveProlog로 시작하는 경우 엄밀한 모드코드가 됩니다.ICT Directive.
  • 마지막 인수가 String이고 처리 시 Use Strict Directive를 포함하는 Directive Prologue로 시작하는 FunctionBody인 경우 기본 함수 및 생성기 생성자에 인수로 제공되는 함수 코드는 strict 모드 코드입니다.

가 발발개 the the the the the"use strict"과 같습니다

  1. 글로벌 변수의 우발적인 선언을 방지합니다.「」를 사용합니다."use strict()"에서는 변수가 반드시 음음음음음 음음음음 with with with with with로 됩니다.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. N.B."use strict"디렉티브는 스크립트 또는 함수의 선두에서만 인식됩니다.
  3. " " ""arguments"변수로 사용할 수 없습니다.

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

즉, 코드가 에러 발생을 억제해, 코드를 올바르게 쓸 수 있게 됩니다.

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

use strict코드를 안전하게 하는 방법입니다.생각만큼 작동하지 않을 수 있는 위험한 기능을 사용할 수 없기 때문입니다.그리고 아까도 썼듯이 코드를 좀 더 엄격하게 만들어요.

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

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

★★"use strict";JS 파일의 맨 위에서 엄격한 구문 검사를 설정합니다.하다

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

  2. 키 JS 시스템 라이브러리를 덮어쓰지 않도록 합니다.

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

use strict개별 기능 내부에서도 작동합니다. 포함시키는 .use strict당신의 코드로.

브라우저 호환성 문제:"사용" 지침은 하위 호환성을 의미합니다.지원하지 않는 브라우저는 더 이상 참조되지 않는 문자열 리터럴만 볼 수 있습니다.그래서 그냥 넘어가고 넘어갈 거예요.

"use strict"는 JavaScript를 조금 더 견고하게 만들기 위한 ECMA의 노력입니다.이는 JS를 최소한 조금 "엄격"하게 만들려는 시도를 가져옵니다(다른 언어들은 90년대 이후 엄격한 규칙을 시행하고 있습니다).실제로 JavaScript 개발자들에게 일종의 코딩 모범 사례를 따르도록 강요합니다.그러나 JavaScript는 매우 취약합니다.유형 변수, 유형 메서드 등은 없습니다.JavaScript 개발자들에게 자바나 ActionScript3와 같은 보다 견고한 언어를 배우고 동일한 베스트 프랙티스를 JavaScript 코드에 구현하면 더 잘 작동하고 디버깅이 쉬워질 것입니다.

일반적으로 JavaScript는 엄격한 규칙을 따르지 않기 때문에 오류가 발생할 가능성이 높아집니다."use strict"JavaScript 코드는 터미네이터 사용, 초기화 전 선언 등 다른 프로그래밍 언어와 마찬가지로 엄격한 규칙 집합을 따라야 합니다.

if"use strict"이 경우 코드는 엄격한 규칙에 따라 작성해야 합니다.따라서 오류 및 모호성의 가능성을 줄일 수 있습니다.

[ Use Strict ]는 일반적인 에러와 반복적인 에러를 표시하기 위해 사용됩니다.이러한 변경은 다음과 같습니다.

  • 우발적인 글로벌 방지

  • 중복 없음

  • 에 의해 배제되다

  • 이 강요를 없앤다.

  • 안전한 평가()

  • 불변의 오류

상세한 것에 대하여는, 이 기사를 참조해 주세요.

"use strict"; JavaScript 코드가 "strict 모드"로 실행되도록 정의합니다.

  • ECMAScript 버전5 에서는, 「use strict」지시가 새롭게 도입되었습니다.
  • 이것은 문이 아니라 리터럴 표현이며 이전 버전의 JavaScript에서는 무시됩니다.
  • "use strict"의 목적은 코드가 "strict 모드"에서 실행되어야 함을 나타내는 것입니다.
  • strict 모드에서는 예를 들어 선언되지 않은 변수를 사용할 수 없습니다.

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

단점

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

게다가 개발자는 통상 모드이기 때문에 추가 에러가 발생하는 장점이 없기 때문에 에러는 사일런트 에러가 될 가능성이 있습니다.

또한 위에서 설명한 바와 같이 strict 모드에서는 특정 작업을 수행할 수 없습니다.

사람들은 애초에 그런 것들을 사용하면 안 된다고 생각하지만, 일부 개발자들은 그 제약이 마음에 들지 않고 언어의 모든 기능을 사용하려고 한다.

strict 모드를 사용하면 메모리 누수를 방지할 수 있습니다.

아래 기능이 엄격하지 않은 모드에서 작성되었는지 확인하십시오.

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

에서는 '를 사용하고 있습니다.name 범위에서 합니다.내부적으로 컴파일러는 먼저 특정 함수 범위에서 특정 이름으로 선언된 변수가 있는지 확인합니다.컴파일러는 이러한 변수가 없다는 것을 알았기 때문에 외부 스코프에서 체크인을 합니다.이 경우 글로벌 범위입니다.컴파일러는 이 이름으로 글로벌 공간에 선언된 변수도 없다는 것을 알고 있기 때문에 글로벌 공간에 이러한 변수를 만듭니다.개념적으로 이 변수는 글로벌 범위에서 생성되며 애플리케이션 전체에서 사용할 수 있습니다.

또 다른 시나리오는 변수가 하위 함수로 선언되는 경우입니다.이 경우 컴파일러는 외부 스코프, 즉 부모 함수의 유효성을 체크합니다.그래야 글로벌 공간을 확인하고 변수를 만들 수 있습니다.즉, 추가 확인이 필요합니다.이것은 애플리케이션의 퍼포먼스에 영향을 줍니다.


이번에는 같은 함수를 strict 모드로 쓰겠습니다.

"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

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

strict 모드는 엄격하지 않은 모드에서 무시될 수 있는 오류를 제거하여 javascript를 "보안"으로 만듭니다.

베스트 프랙티스에 포함됩니까?

, javascript를 사용하여 Strict 모드를 사용할 때 베스트 프랙티스의 일부로 간주됩니다.이것은 JS 파일에 다음 줄의 코드를 추가하는 것으로 이루어집니다.

'use strict';

당신의 코드로.

사용자 에이전트에게 어떤 의미가 있습니까?

코드가 엄밀한 모드로 해석되어야 함을 나타내는 것은 브라우저와 같은 사용자 에이전트에 대해 코드를 문자 그대로 기술한 대로 처리하도록 지정하고 코드가 의미가 없는 경우 오류를 발생시킵니다.

예를 들어 다음과 같습니다.고려 사항:.js adda는 다음과 같습니다.

시나리오 1: [NO STRIT MODE]

var city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago

시나리오 2: [NO STRIT MODE]

city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago

그러면 왜 변수 이름이 두 경우 모두 인쇄되는 걸까요?

strict 모드가 켜져 있지 않은 경우 사용자 에이전트는 문제가 있는 코드를 의미 있게 하기 위해 일련의 수정을 거치는 경우가 많습니다.겉으로 보기에는 괜찮은 것처럼 보일 수 있고, 실제로 엄밀한 모드 이외에서 작업하는 것은 모든 세부 사항을 정확하게 파악하지 않고도 JavaScript 코드에 발을 담그는 것을 가능하게 한다.하지만 개발자로서 코드에 버그를 남기는 것은 싫습니다.버그가 나중에 돌아와서 나를 물릴 수도 있고 좋은 코드를 쓰고 싶을 뿐이기 때문입니다.그게 바로 strict 모드가 도움이 되는 부분이죠.

시나리오 3: [엄격한 모드]

'use strict';

city = "Chicago"
console.log(city) // Reference Error: asignment is undeclared variable city.

기타 힌트:strict 모드를 사용하여 코드 품질을 유지하기 위해 특히 여러 개의 코드를 사용하는 경우 이 값을 반복해서 쓸 필요가 없습니다..js이할 수 .eslint을 사용하다

파일 이름: .eslintrc.js

module.exports = {
    env: {
        es6: true
    },
    rules : {
        strict: ['error', 'global'],
        },
    };
    

그럼 엄밀한 모드에서는 무엇을 막을 수 있을까요?

  • 변수를 선언하지 않고 사용하면 엄밀한 모드에서 오류가 발생합니다.이는 애플리케이션 전체에서 의도하지 않게 글로벌 변수가 생성되는 것을 방지하기 위한 것입니다.인쇄 시카고의 예에서는 특히 이 내용을 다룹니다.

  • 변수, 함수 또는 인수를 삭제하는 은 strict 모드에서는 no입니다.

    "use strict";
     function x(p1, p2) {}; 
     delete x; // This will cause an error
    
  • 완전 모드에서는 파라미터 이름의 중복허용되지 않습니다.

     "use strict";
     function x(p1, p1) {};   // This will cause an error
    
  • Javascript 언어로 예약된 단어는 strict 모드에서 허용되지 않습니다.이 단어들은 구현 인터페이스, let, packages, private, protected, public입니다.정적 및 항복

보다 포괄적인 리스트에 대해서는, 다음의 MDN 문서를 참조해 주세요.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

JavaScript는 브라우저 전쟁과 잘못된 관리로 인해 급하게 설계되고 구현되었습니다.그 결과, 많은 부적절한 설계 결정, 직관적이지 않은 구문 및 혼란스러운 의미론이 언어에 침투했습니다.strict 모드는 이러한 오류의 일부를 수정하는 것을 목적으로 합니다.

그러나 대체 해석을 하지 않고 이러한 오류를 수정하면 하위 호환성이 깨집니다.so,는,"use strict"디렉티브는 코드를 프로그래머에게 전달하는 동안 코드에 대한 대체 해석을 생성합니다.

를 들어, 「」라고 하는 것은,this. 예를 들어, 메서드 정의의 오브젝트를 .this ★★★★★★★★★★★★★★★★★」self뭇매를 치다

let o = {
  name: 'John Doe',
  sayName: function(){
    console.log(this.name);
  }
};

o.sayName(); // 'John Doe'

this 이외의 에 JavaScript가 있습니다.this키워드를 지정합니다.

function run() {
  console.log(this);
}

run(); // Window

서 ★★★★this글로벌 개체가 이미 범위에서 사용 가능하기 때문에 의미가 없고 목적도 없는 글로벌 개체로 해결됩니다.

에서는 strict " "this정의되지 않은 함수로 해결됩니다(예상대로).

"use strict"

function run() {
  console.log(this);
}

run(); // undefined

일부 할 수 오류는 에서는 구문이 .이러한 오류는 오래된 브라우저에서는 무시되기 입니다."strict mode"이치노

strict 모드는 v8 엔진에서 엄격한 기능을 활성화합니다.일부 기능의 간단한 예:

다음과 같이 기술하면, 글로벌하게 유효하게 할 수 있습니다.

'use strict'; // strict mode enabled!

함수에 포함된 기능별:

let myfunc = () => {
  'use strict'; // strict mode enabled
  
   b = 0; // broke
}
  • 변수를 사용하기 전에 선언해야 합니다(sane imo).
  var x;
  x = '0'; // ok
  y = '';  // not ok
  • es6 기능이 활성화되어 있습니다(이것은 브라우저에 의존합니다).노드 v4+에서는 이것이 중요합니다.

  • 경우에 따라서는 퍼포먼스가 향상될 수 있습니다.

더 많은 기능이 있습니다. 자세한 내용은 여기를 참조하십시오.

언급URL : https://stackoverflow.com/questions/1335851/what-does-use-strict-do-in-javascript-and-what-is-the-reasoning-behind-it

반응형