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

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

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

검색을 해보니 어떤 사람들은 이렇게 덧붙인다는 것을 알게 되었다."use strict";JavaScript 코드로 변환합니다.스테이트먼트를 추가하자 에러가 표시되지 않게 되었습니다.안타깝게도 구글은 이 문자열 성명 뒤에 숨겨진 많은 역사를 밝히지 않았다.브라우저에 의한 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"; 

현재 코드에 입력해도 문자열이기 때문에 현재 브라우저에서는 문제가 발생하지 않습니다.나중에 코드가 플러그마를 위반할 경우 코드에 문제가 발생할 수 있습니다.예를 들어, 현재 다음과 같은 경우foo = "bar"정의하지 않고foo먼저, 코드가 고장나기 시작합니다…제 생각에는 좋은 것 같아요.




스테이트먼트"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. evalstrict 모드에서는 새로운 변수가 도입되지 않습니다.

  9. 플레인 이름을 삭제할 수 없습니다(delete x;)

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

  11. 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, and only THEN start marking all your new modules as "use strict". Be prepared to cure lots of niggly errors and warnings. Make sure everyone understands the gravity by configuring the build to FAIL if JSHint/JSLint produces any violations.

My project was not a greenfield project when I adopted "use strict". As a result, my IDE is full of red marks because I don’t have "use strict" on half my modules, and JSHint complains about that. It’s a reminder to me about what refactoring I should do in the future. My goal is to be red mark free due to all of my missing "use strict" statements, but that is years away now.