최근에 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 모드를 사용하도록 브라우저에 지시합니다.
기능 목록(비유출)
글로벌 변수를 허용하지 않습니다.(캐치 누락)
var
변수 이름의 선언 및 오타)자동 실패 할당은 엄밀한 모드에서 오류를 발생시킵니다(할당).
NaN = 5;
)삭제할 수 없는 속성을 삭제하려고 하면 ( )
delete Object.prototype
)개체 리터럴의 모든 속성 이름이 고유해야 합니다().
var x = {x1: "1", x1: "2"}
)함수 매개 변수 이름은 고유해야 합니다.
function sum (x, x) {...}
)8진수 구문을 금지합니다(
var x = 023;
일부 dev는 앞의 0이 번호를 변경하지 않는다고 잘못 가정합니다.)를 금지합니다.
with
키워드eval
strict 모드에서는 새로운 변수가 도입되지 않습니다.플레인 이름을 삭제할 수 없습니다(
delete x;
)이름의 바인딩 또는 할당을 금지합니다.
eval
그리고.arguments
어떤 형태로든strict 모드는 의 속성에 별칭을 지정하지 않습니다.
arguments
형식 매개 변수를 사용하여 개체를 지정합니다.(예:function sum (a,b) { return arguments[0] + b;}
이것은, 다음과 같은 이유로 동작합니다.arguments[0]
할 수밖에 없다a
등). (차이에 대해서는 다음 항을 참조해 주세요.)arguments.callee
지원되지 않습니다.
[참조: 엄밀한 모드, Mozilla 개발자 네트워크]
예:
- 엄밀한 모드 코드는 코드 내에서 생성된 인수 개체의 속성에 별칭을 지정하지 않습니다.
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.