질문자 :Mark Rogers
최근에 Crockford의 JSLint를 통해 JavaScript 코드 중 일부를 실행했는데 다음 오류가 발생했습니다.
1행 문자 1의 문제: "use strict" 문이 누락되었습니다.
검색을 해보니 어떤 사람들은 "use strict";
그들의 JavaScript 코드에. 명령문을 추가하면 오류가 표시되지 않습니다. 불행히도 Google은 이 문자열 문 뒤에 숨겨진 많은 역사를 공개하지 않았습니다. 확실히 브라우저에서 JavaScript를 해석하는 방식과 관련이 있어야 하지만 어떤 효과가 있을지 모르겠습니다.
"use strict";
이란 무엇입니까? 그것은 무엇을 의미하며 여전히 관련성이 있습니까?
"use strict";
응답하는 브라우저가 있습니까? 문자열 또는 향후 사용을 위한 것입니까?
답변자 : Pascal MARTIN
Javascript Strict Mode에 대한 이 기사는 다음과 같습니다. John Resig - ECMAScript 5 Strict Mode, JSON 등
흥미로운 부분을 인용하자면:
엄격한 모드는 "엄격한" 운영 컨텍스트에 프로그램 또는 기능을 배치할 수 있게 해주는 ECMAScript 5의 새로운 기능입니다. 이 엄격한 컨텍스트는 특정 작업이 수행되는 것을 방지하고 더 많은 예외를 발생시킵니다.
그리고:
엄격 모드는 몇 가지 방법으로 도움이 됩니다.
- 예외를 던지는 몇 가지 일반적인 코딩 실수를 포착합니다.
- 상대적으로 "안전하지 않은" 작업(예: 전역 개체에 대한 액세스 권한 획득)이 수행될 때 오류를 방지하거나 발생시킵니다.
- 혼란스럽거나 잘못 생각한 기능을 비활성화합니다.
또한 전체 파일에 "엄격한 모드"를 적용할 수 있습니다... 또는 특정 기능에만 사용할 수 있습니다 (여전히 John Resig의 기사에서 인용) .
// Non-strict code... (function(){ "use strict"; // Define your library strictly... })(); // Non-strict code...
이전 코드와 새 코드를 혼합해야 하는 경우 도움이 될 수 있습니다. ;-)
따라서 Perl에서 사용할 수 "use strict"
와 약간 비슷하다고 생각합니다 (따라서 이름이?) . 파손으로 이어질 수 있는 항목을 더 많이 감지하여 오류를 줄이는 데 도움이 됩니다.
엄격한 모드는 이제 모든 주요 브라우저에서 지원됩니다 .
기본 ECMAScript 모듈 ( import
및 export
문 포함) 및 ES6 클래스 내 에서 엄격 모드는 항상 활성화되며 비활성화할 수 없습니다.
답변자 : seth
ECMAScript 5의 새로운 기능입니다. John Resig가 이에 대한 멋진 요약 을 작성했습니다.
다음과 같이 JavaScript 파일(파일 상단 또는 함수 내부)에 넣은 문자열일 뿐입니다.
"use strict";
이제 코드에 넣으면 문자열일 뿐이므로 현재 브라우저에서 문제를 일으키지 않아야 합니다. 코드가 pragma를 위반하면 나중에 코드에 문제가 발생할 수 있습니다. 예를 들어, 현재 foo
먼저 정의하지 않고 foo = "bar"
가 있는 경우 코드가 실패하기 시작할 것입니다... 이것은 제 생각에 좋은 것입니다.
답변자 : gprasant
"use strict";
문; JavaScript의 축소되고 안전한 기능 세트인 Strict 모드를 사용하도록 브라우저에 지시합니다.
기능 목록(일부)
전역 변수를 허용하지 않습니다. (변수 이름에 누락된 var
선언 및 오타 포착)
자동 실패 할당은 엄격 모드에서 오류를 발생시킵니다(할당 NaN = 5;
).
삭제할 수 없는 속성을 삭제하려고 하면 throw됩니다( delete Object.prototype
).
개체 리터럴의 모든 속성 이름은 고유해야 합니다( var x = {x1: "1", x1: "2"}
).
함수 매개변수 이름은 고유해야 합니다( function sum (x, x) {...}
).
8진수 구문 금지( var x = 023;
일부 개발자는 앞에 오는 0이 숫자를 변경하는 데 아무 것도 하지 않는다고 잘못 가정합니다.)
with
키워드 금지
eval
은 새 변수를 도입하지 않습니다.
일반 이름 삭제 금지( delete x;
)
어떤 형식으로든 eval
및 arguments
의 바인딩 또는 할당을 금지합니다.
엄격 모드는 형식 매개변수를 사용하여 arguments
개체의 속성에 별칭을 지정하지 않습니다. (예에서 function sum (a,b) { return arguments[0] + b;}
이 작동하기 때문에 arguments[0]
에 바인딩 . 등) a
arguments.callee
는 지원되지 않습니다.
[참고: 엄격 모드 , Mozilla 개발자 네트워크 ]
답변자 : Jamie Hutber
use strict
를 사용하는 것에 대해 걱정한다면 이 기사를 확인해 볼 가치가 있습니다.
브라우저에서 ECMAScript 5 '엄격한 모드' 지원. 이것은 무엇을 의미 하는가?
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. */
답변자 : DWoldrich
과감한 프로그래머 여러분, 주의하십시오. "use strict"
를 적용하는 것은 위험할 수 있습니다! 이것은 코드를 '더 좋게' 만들 수 있는 기분 좋은 행복한 얼굴 스티커가 아닙니다. "use strict"
프라그마를 사용하면 브라우저가 갑자기 이전에 던진 적이 없는 임의의 위치에서 예외를 던질 것입니다. 그 지점에서 기본/느슨한 JavaScript가 기꺼이 허용하지만 엄격한 JavaScript는 싫어하는 일을 하고 있기 때문입니다! 코드에서 거의 사용되지 않는 호출에 숨겨진 엄격성 위반이 있을 수 있습니다. 이 호출은 유료 고객이 사용하는 프로덕션 환경과 같이 결국 실행될 때만 예외를 throw합니다!
뛰어들 예정이라면 포괄적인 단위 테스트와 엄격하게 구성된 JSHint 빌드 작업과 함께 "use strict"
를 적용하는 것이 좋습니다. 엄격 모드를 켰기 때문에 끔찍합니다. 또는 여기 또 다른 옵션 "use strict"
를 추가하지 마십시오. 솔직히 그렇게 하는 것이 더 안전할 수 있습니다. 확실히 타사 모듈과 같이 소유하거나 유지 관리하지 않는 모듈에 "use strict"
를 추가하지 마십시오.
우리에 갇힌 치명적인 동물일지라도 "use strict"
것이 좋은 것일 수 있지만 올바르게 해야 한다고 생각합니다. 엄격해지기 가장 좋은 시기는 프로젝트가 미개발 상태이고 처음부터 시작할 때입니다. JSHint/JSLint
를 팀이 감당할 수 있는 한 최대로 강화된 모든 경고 및 옵션으로 구성하고 Grunt+Karma+Chai
"use strict"
로 표시하기 시작합니다. "use strict"
. 사소한 오류와 경고를 많이 처리할 준비를 하십시오. JSHint/JSLint
가 위반을 생성하는 경우 빌드를 FAIL로 구성하여 모든 사람이 중력을 이해하도록 합니다.
"use strict"
채택했을 때 내 프로젝트는 미개발 프로젝트가 아니었습니다. "use strict"
가 없기 때문에 내 IDE는 빨간색 표시로 가득 차 있고 JSHint는 이에 대해 불평합니다. 앞으로 내가 어떤 리팩토링을 해야 하는지를 상기시켜줍니다. "use strict"
문으로 인해 빨간색 표시가 없는 것이지만 이제 몇 년이 남았습니다.
답변자 : sampathsris
'엄격한 사용 'use strict';
갑자기 코드가 향상되지 않습니다.
JavaScript 엄격 모드 는 ECMAScript 5 의 기능입니다. 스크립트/함수의 맨 위에 이것을 선언하여 엄격 모드를 활성화할 수 있습니다.
'use strict';
JavaScript 엔진이 이 지시문을 보면 특수 모드에서 코드를 해석하기 시작합니다. 이 모드에서는 잠재적인 버그가 될 수 있는 특정 코딩 관행이 감지될 때 오류가 발생합니다(이것이 엄격 모드의 이유입니다).
다음 예를 고려하십시오.
var a = 365; var b = 030;
숫자 리터럴을 정렬하려는 집착에서 개발자는 실수로 변수 b
를 8진수 리터럴로 초기화했습니다. 비 엄격 모드는 이것을 값이 24
숫자 리터럴로 해석합니다(10진법 기준). 그러나 엄격 모드에서는 오류가 발생합니다.
엄격 모드의 전문 분야에 대한 포괄적이지 않은 목록은 이 답변을 참조하십시오.
어디에서 'use strict';
?
내 새 JavaScript 응용 프로그램에서: 절대적으로! 코드로 어리석은 일을 할 때 Strict 모드를 내부 고발자로 사용할 수 있습니다.
내 기존 JavaScript 코드에서: 아마도 아닐 것입니다! 기존 JavaScript 코드에 엄격 모드에서 금지된 문이 있는 경우 애플리케이션이 중단됩니다. 엄격 모드를 원하면 기존 코드를 디버그하고 수정할 준비가 되어 있어야 합니다. 'use strict';
이유입니다. 갑자기 코드가 향상되지 않습니다 .
엄격 모드는 어떻게 사용합니까?
'use strict';
삽입하십시오. 스크립트 상단의 문:
// File: myscript.js 'use strict'; var a = 2; ....
myscript.js
파일의 모든 내용은 엄격 모드에서 해석됩니다.
'use strict';
삽입하십시오. 함수 본문 상단의 문:
function doSomething() { 'use strict'; ... }
doSomething
함수 의 어휘 범위 에 있는 모든 것은 엄격 모드에서 해석됩니다. 여기서 어휘 범위 라는 단어가 중요합니다. 예를 들어 엄격한 코드가 strict 가 아닌 라이브러리의 함수를 호출하는 경우 호출된 함수가 아닌 코드만 엄격 모드에서 실행됩니다. 더 나은 설명 은 이 답변 을 참조하십시오.
엄격 모드에서 금지되는 것은 무엇입니까?
엄격 모드에서 금지되는 몇 가지 사항을 설명하는 멋진 기사 를 찾았습니다(이 목록은 단독 목록이 아님에 유의).
범위
역사적으로 JavaScript는 함수의 범위가 어떻게 지정되는지에 대해 혼란스러워했습니다. 때로는 정적으로 범위가 지정되는 것처럼 보이지만 일부 기능으로 인해 동적으로 범위가 지정된 것처럼 동작합니다. 이것은 혼란스러워서 프로그램을 읽고 이해하기 어렵게 만듭니다. 오해는 버그를 일으킵니다. 성능에도 문제가 있다. 정적 범위 지정은 컴파일 시간에 변수 바인딩을 허용하지만 동적 범위에 대한 요구 사항은 바인딩이 런타임으로 연기되어야 함을 의미하므로 상당한 성능 저하가 수반됩니다.
엄격 모드에서는 모든 변수 바인딩이 정적으로 수행되어야 합니다. 즉, 이전에 동적 바인딩이 필요했던 기능을 제거하거나 수정해야 합니다. 특히 with 문이 제거되고 호출자의 환경을 변조하는 평가 함수의 기능이 심각하게 제한됩니다.
엄격한 코드의 이점 중 하나는 YUI Compressor 와 같은 도구가 처리할 때 더 나은 작업을 수행할 수 있다는 것입니다.
내재된 전역 변수
JavaScript에는 전역 변수가 포함되어 있습니다. 변수를 명시적으로 선언하지 않으면 전역 변수가 암시적으로 선언됩니다. 이것은 초보자가 기본적인 가사 일을 소홀히 할 수 있기 때문에 프로그래밍을 더 쉽게 만듭니다. 그러나 더 큰 프로그램의 관리를 훨씬 더 어렵게 만들고 안정성을 크게 떨어뜨립니다. 따라서 엄격 모드에서는 묵시적 전역 변수가 더 이상 생성되지 않습니다. 모든 변수를 명시적으로 선언해야 합니다.
글로벌 누출
this
전역 개체에 바인딩되도록 하는 여러 상황이 있습니다. 예를 들어, 생성자 함수를 호출할 때 new
접두사를 제공하는 것을 잊으면 this
가 예기치 않게 전역 개체에 바인딩되므로 새 개체를 초기화하는 대신 전역 변수를 자동으로 변경하게 됩니다. 이러한 상황에서 엄격 모드는 대신 undefined
this
그러면 생성자가 대신 예외를 throw하여 오류를 훨씬 더 빨리 감지할 수 있습니다.
시끄러운 실패
JavaScript에는 항상 읽기 전용 속성이 있었지만 ES5의 Object.createProperty
함수가 해당 기능을 공개할 때까지 직접 생성할 수 없었습니다. 읽기 전용 속성에 값을 할당하려고 하면 자동으로 실패합니다. 할당은 속성 값을 변경하지 않지만 프로그램은 그대로 진행됩니다. 이것은 프로그램을 일관성 없는 상태로 만들 수 있는 무결성 위험입니다. 엄격 모드에서 읽기 전용 속성을 변경하려고 하면 예외가 발생합니다.
8진수
숫자의 8진법(또는 밑수 8) 표현은 단어 크기가 3의 배수인 기계에서 기계 수준 프로그래밍을 수행할 때 매우 유용했습니다. 단어 크기가 60비트인 CDC 6600 메인프레임으로 작업할 때 8진법이 필요했습니다. 8진수를 읽을 수 있다면 단어를 20자리로 볼 수 있습니다. 두 자리는 연산 코드를 나타내고 한 자리는 8개의 레지스터 중 하나를 나타냅니다. 기계 코드에서 고급 언어로의 느린 전환 동안 프로그래밍 언어에서 8진수 형식을 제공하는 것이 유용하다고 생각되었습니다.
C에서는 극도로 불행한 8진수 표현이 선택되었습니다: 선행 0. 따라서 C에서 0100
은 100이 아니라 64를 의미하며 08
은 8이 아니라 오류입니다. 더욱 불행하게도 이 시대착오적 표현은 오류를 만드는 데만 사용되는 JavaScript를 포함한 거의 모든 현대 언어에 복사되었습니다. 다른 목적은 없습니다. 따라서 엄격 모드에서는 8진수 형식이 더 이상 허용되지 않습니다.
등등
인수 의사 배열은 ES5에서 조금 더 배열과 비슷해집니다. 엄격 모드에서는 callee
및 caller
속성이 손실됩니다. 이렇게 하면 많은 기밀 컨텍스트를 포기하지 않고 신뢰할 수 없는 코드에 arguments
를 전달할 수 있습니다. 또한 arguments
속성이 제거되었습니다.
엄격 모드에서는 함수 리터럴의 중복 키가 구문 오류를 생성합니다. 함수는 같은 이름을 가진 두 개의 매개변수를 가질 수 없습니다. 함수는 매개변수 중 하나와 이름이 같은 변수를 가질 수 없습니다. 함수는 자체 변수를 delete
delete
하려고 하면 이제 예외가 발생합니다. 기본 값은 암시적으로 래핑되지 않습니다.
향후 JavaScript 버전용 예약어
ECMAScript 5는 예약어 목록을 추가합니다. 변수나 인수로 사용하면 엄격 모드에서 오류가 발생합니다. 예약어는 다음과 같습니다.
implements
, interface
, let
, package
, private
, protected
, public
, static
및 yield
추가 읽기
답변자 : Pank
모든 개발자가 지금 엄격 모드를 사용하기 시작할 것을 강력히 권장합니다. 엄격 모드는 우리가 코드에 있는지조차 몰랐던 오류로부터 우리를 안전하게 보호하는 데 합법적으로 도움이 될 것이므로 이를 지원하는 브라우저가 충분합니다.
분명히 초기 단계에서 우리가 이전에 만난 적이 없는 오류가 있을 것입니다. 모든 이점을 얻으려면 엄격 모드로 전환한 후 적절한 테스트를 수행하여 모든 것을 포착했는지 확인해야 합니다. 확실히 우리는 use strict
를 던지고 오류가 없다고 가정하지 않습니다. 따라서 이 매우 유용한 언어 기능을 사용하여 더 나은 코드를 작성할 때입니다.
예를 들어,
var person = { name : 'xyz', position : 'abc', fullname : function () { "use strict"; return this.name; } };
JSLint 는 Douglas Crockford가 작성한 디버거입니다. 스크립트에 붙여넣기만 하면 코드에서 눈에 띄는 문제와 오류가 있는지 빠르게 검색합니다.
답변자 : Ely
나는 다른 답변을 보완하는 다소 더 기초적인 답변을 제공하고 싶습니다. 가장 인기 있는 답변을 편집하고 싶었지만 실패했습니다. 최대한 포괄적이고 완전하게 만들려고 노력했습니다.
자세한 내용은 MDN 설명서 를 참조하십시오.
"use strict"
는 ECMAScript 5에 도입된 지시문입니다.
지시문은 명령문과 유사하지만 다릅니다.
-
use strict
는 키워드를 포함하지 않습니다. 지시문은 특수 문자열 리터럴(작은 따옴표 또는 큰 따옴표로 묶음)로 구성된 단순 표현식입니다. ECMAScript 5를 구현하지 않는 JavaScript 엔진은 부작용 없이 표현식 문만 봅니다. ECMAScript 표준의 향후 버전에서는 실제 키워드로 use
따라서 따옴표는 쓸모 없게 될 것입니다. -
use strict
는 스크립트나 함수의 시작 부분에서만 사용할 수 있습니다. 즉, 다른 모든 (실제) 문 앞에 와야 합니다. 함수 스크립트의 첫 번째 명령어일 필요는 없습니다. 문자열 리터럴로 구성된 다른 명령문 표현식이 앞에 올 수 있습니다(자바스크립트 구현에서는 이를 구현별 지시문으로 처리할 수 있음). (스크립트 또는 함수에서) 첫 번째 실제 명령문 뒤에 오는 문자열 리터럴 명령문은 단순 표현식 명령문입니다. 통역사는 이를 지시문으로 해석해서는 안 되며 효력이 없습니다.
use strict
지시문은 다음 코드(스크립트 또는 함수에서)가 엄격한 코드임을 나타냅니다. 스크립트의 최상위 수준에 있는 코드(함수에 없는 코드)는 스크립트에 use strict
지시문이 포함된 경우 엄격한 코드로 간주됩니다. use strict
지시문이 포함된 경우 함수의 내용은 엄격한 코드로 간주됩니다. 에 전달되는 코드 eval()
메소드는 엄격한 코드로 간주됩니다 eval()
엄격한 코드에서 호출 또는 포함 된 use strict
지침 자체를.
ECMAScript 5의 엄격 모드는 JavaScript 언어의 제한된 하위 집합으로, 언어의 관련 결함을 제거하고 더 엄격한 오류 검사 및 더 높은 보안을 제공합니다. 다음은 엄격 모드와 일반 모드의 차이점을 나열합니다(처음 세 가지가 특히 중요함).
- 엄격 모드
with
문을 사용할 수 없습니다. - 엄격 모드에서는 모든 변수를 선언해야 합니다. 변수, 함수, 함수 매개변수, catch-clause 매개변수 또는 전역
Object
속성으로 선언되지 않은 식별자에 값을 할당하면 ReferenceError
합니다. 일반 모드에서 식별자는 암시적으로 전역 변수로 선언됩니다(전역 Object
의 속성으로). - 엄격 모드에서 키워드
this
는 함수(메소드가 아님)로 호출된 함수에서 undefined
값을 갖습니다. (일반 모드에서 this
항상 전역 Object
가리킵니다). 이 차이는 구현이 엄격 모드를 지원하는지 테스트하는 데 사용할 수 있습니다.
var hasStrictMode = (function() { "use strict"; return this===undefined }());
또한 함수가 call()
로 호출되거나 엄격 모드에서 apply
this
call()
또는 apply()
호출의 첫 번째 인수 값입니다. (일반 모드에서 null
및 undefined
Object
로 대체되고 개체가 아닌 값은 개체로 캐스팅됩니다.)
엄격 모드에서 읽기 전용 속성에 할당하거나 확장할 수 없는 객체에 대한 새 속성을 정의하려고 TypeError
(일반 모드에서는 둘 다 오류 메시지 없이 단순히 실패합니다.)
-
eval()
코드를 전달할 때 호출자의 범위에서 변수나 함수를 선언하거나 정의할 수 없습니다(일반 모드에서 할 수 있는 것처럼). eval()
대한 새 범위가 생성되고 변수와 함수가 해당 범위 내에 있습니다. 해당 범위는 eval()
실행이 완료된 후 소멸됩니다. - 엄격 모드에서 함수의 arguments-object는 해당 함수에 전달되는 값의 정적 복사본을 포함합니다. 일반 모드에서 arguments-object는 다소 "마법 같은" 동작을 합니다. 배열의 요소와 명명된 함수 매개변수는 둘 다 동일한 값을 참조합니다.
-
delete
연산자 다음에 비정규 식별자(변수, 함수 또는 함수 매개변수)가 올 때 SyntaxError
발생합니다. 일반 모드에서 delete
표현식은 아무 것도 하지 않으며 false
로 평가됩니다. - 엄격 모드에서 구성할 수 없는 속성을 삭제하려고
TypeError
(일반 모드에서 시도는 단순히 실패하고 delete
false
로 평가됩니다). - 엄격 모드에서는 개체 리터럴에 대해 동일한 이름을 가진 여러 속성을 정의하려고 하면 구문 오류로 간주됩니다. (일반 모드에서는 오류가 없습니다.)
- 엄격 모드에서는 함수 선언에 같은 이름의 매개변수가 여러 개 있는 경우 구문 오류로 간주됩니다. (일반 모드에서는 오류가 없습니다.)
- 엄격 모드에서는 8진수 리터럴이 허용되지 않습니다(이것은
0x
시작하는 리터럴입니다. 일반 모드에서 일부 구현에서는 8진수 리터럴을 허용합니다.) - 엄격 모드에서 식별자
eval
및 arguments
는 키워드처럼 취급됩니다. 값을 변경할 수 없고 값을 할당할 수 없으며 변수, 함수, 함수 매개변수 또는 catch 블록의 식별자에 대한 이름으로 사용할 수 없습니다. - 엄격 모드에서는 호출 스택을 검사할 가능성이 더 많습니다.
arguments.caller
및 arguments.callee
는 엄격 모드의 함수에서 TypeError
를 일으킵니다. 또한 엄격 모드에서 함수의 일부 호출자 및 인수 속성을 읽으려고 할 때 TypeError
답변자 : Community Wiki
내 2센트:
엄격 모드의 목표 중 하나는 문제의 더 빠른 디버깅을 허용하는 것입니다. 웹 페이지의 조용하고 이상한 동작을 유발할 수 있는 특정 잘못된 일이 발생할 때 예외를 throw하여 개발자를 돕습니다. 우리가 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);
이제 이 코드는 window.nameoftree
사용하여 액세스할 수 있는 전역 범위에서 nameoftree
를 만듭니다. use strict
를 구현하면 코드에서 오류가 발생합니다.
잡히지 않은 ReferenceError: nameoftree가 정의되지 않았습니다.
견본
제거 with
문 :
with
문은 uglify-js 와 같은 도구를 사용하여 축소할 수 없습니다. 또한 향후 JavaScript 버전에서 더 이상 사용되지 않으며 제거됩니다.
견본
중복 방지:
속성이 중복되면 예외가 발생합니다.
잡히지 않은 SyntaxError: 객체 리터럴의 중복 데이터 속성은 엄격 모드에서 허용되지 않습니다.
"use strict"; var tree1Data = { name: 'Banana Tree', age: 100, leafCount: 100000, name:'Banana Tree' };
몇 가지 더 있지만 그것에 대해 더 많은 지식을 얻을 필요가 있습니다.
답변자 : Stephen
작년 정도에 출시된 브라우저를 사용하는 경우 JavaScript Strict 모드를 지원할 가능성이 큽니다. ECMAScript 5가 현재 표준이 되기 전의 구형 브라우저만 지원하지 않습니다.
명령 주위의 따옴표는 코드가 이전 브라우저에서도 여전히 작동하는지 확인합니다(단, 엄격 모드에서 구문 오류를 생성하는 항목은 일반적으로 이전 브라우저에서 감지하기 어려운 방식으로 스크립트가 오작동하게 만들지만).
답변자 : zangw
"use strict";
추가할 때; , 다음 경우에는 스크립트가 실행되기 전에 SyntaxError가 발생합니다.
(ECMAScript를 6 예견에서) 새로 예약 된 키워드 중 하나를 사용하여, 미래에 대한 ECMAScript 버전에 대한 방법을 포장 implements
, interface
, let
, package
, private
, protected
, public
, static
및 yield
.
블록에서 함수 선언
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 사용하기 delete
delete myVariable;
변수 또는 함수 인수 이름으로 eval
또는 arguments
사용
"use strict"; arguments++; var obj = { set p(arguments) { } }; try { } catch (arguments) { } function arguments() { }
출처:
답변자 : Renganathan M G
엄격 모드는 일반 JavaScript 의미 체계에 몇 가지 변경 사항을 적용합니다.
오류를 발생시키도록 변경하여 일부 JavaScript 자동 오류를 제거합니다.
JavaScript 엔진이 최적화를 수행하기 어렵게 만드는 실수를 수정합니다.
ECMAScript의 향후 버전에서 정의될 가능성이 있는 일부 구문을 금지합니다.
자세한 내용은 Strict Mode-Javascript를 방문하십시오.
답변자 : user2436758
"엄격한 사용"; 프로그래머가 JavaScript의 느슨하거나 나쁜 속성을 사용하지 않을 것이라는 보장입니다. 눈금자가 직선을 만드는 데 도움이 되는 것과 같은 안내자입니다. "Strict 사용"은 "스트레이트 코딩"을 수행하는 데 도움이 됩니다.
눈금자를 사용하여 줄을 똑바로 세우는 것을 선호하지 않는 사람들은 대개 다른 사람들에게 코드를 디버그하도록 요청하는 페이지에서 끝납니다.
나를 믿어. 오버헤드는 잘못 설계된 코드에 비해 무시할 수 있습니다. 몇 년 동안 수석 JavaScript 개발자로 일해 온 Doug Crockford는 여기에 매우 흥미로운 게시물을 올렸습니다 . 개인적으로, 나는 나의 좋은 연습을 잊지 않기 위해 항상 그의 사이트로 돌아가고 싶습니다.
최신 JavaScript 관행은 항상 "엄격한 사용"을 불러일으킵니다. 프래그마. ECMA 그룹이 "엄격" 모드를 선택 사항으로 만든 유일한 이유는 경험이 적은 코더가 JavaScript에 액세스할 수 있도록 허용하고 새롭고 안전한 코딩 방식에 적응할 시간을 주기 위함입니다.
답변자 : Placeholder
use strict
를 포함하는 것은 더 나은 JavaScript 프로그래머가 되고 무작위 변수가 전역 변수가 되고 상황이 자동으로 변경되는 것을 방지하는 작은 방법입니다.
답변자 : Heich-B
w3schools에서 인용 :
"엄격한 사용" 지침
"use strict" 지시문은 JavaScript 1.8.5(ECMAScript 버전 5)의 새로운 기능입니다.
이것은 문이 아니라 이전 버전의 JavaScript에서 무시되는 리터럴 표현식입니다.
"use strict"의 목적은 코드가 "strict 모드"에서 실행되어야 함을 나타내는 것입니다.
엄격 모드에서는 예를 들어 선언되지 않은 변수를 사용할 수 없습니다.
왜 엄격한 모드인가?
엄격 모드를 사용하면 "보안" JavaScript를 더 쉽게 작성할 수 있습니다.
엄격 모드는 이전에 허용된 "잘못된 구문"을 실제 오류로 변경합니다.
예를 들어, 일반 JavaScript에서 변수 이름을 잘못 입력하면 새 전역 변수가 생성됩니다. 엄격 모드에서는 오류가 발생하여 실수로 전역 변수를 생성할 수 없습니다.
일반 JavaScript에서 개발자는 쓰기 불가능한 속성에 값을 할당하는 오류 피드백을 받지 않습니다.
엄격 모드에서 쓰기 불가능 속성, getter 전용 속성, 존재하지 않는 속성, 존재하지 않는 변수 또는 존재하지 않는 객체에 대한 할당은 오류를 발생시킵니다.
자세한 내용은 http://www.w3schools.com/js/js_strict.asp 를 참조하십시오.
답변자 : Alireza
"use strict"
는 JavaScript 코드가 엄격 모드 에서 실행되도록 합니다. 이는 기본적으로 사용하기 전에 모든 것을 정의해야 함을 의미합니다. 엄격 모드를 사용하는 주된 이유는 정의되지 않은 메서드의 우연한 전역 사용을 피하기 위함입니다.
또한 엄격 모드에서는 작업이 더 빠르게 실행되고 일부 경고 또는 자동 경고는 치명적인 오류를 발생하므로 항상 더 깔끔한 코드를 만드는 데 사용하는 것이 좋습니다.
"use strict"
는 ECMA5에서 널리 사용되어야 하며 ECMA6에서는 기본적으로 JavaScript의 일부 이므로 ES6을 사용하는 경우 추가할 필요가 없습니다.
MDN의 다음 진술과 예를 살펴보십시오.
"엄격한 사용" 지침
"use strict" 지시문은 JavaScript 1.8.5(ECMAScript 버전 5)의 새로운 기능입니다. 이것은 문이 아니라 이전 버전의 JavaScript에서 무시되는 리터럴 표현식입니다. "use 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에서 더 많은 것을 읽을 수 있습니다.
답변자 : FutureNerd
ECMAScript 위원회에 있었던 몇몇 사람들의 좋은 이야기가 있습니다: " Changes to JavaScript, Part 1: ECMAScript 5" "use strict"
스위치를 점진적으로 사용하여 JavaScript 구현자가 JavaScript 없이 JavaScript의 위험한 많은 기능을 정리할 수 있도록 하는 방법에 대해 갑자기 세계의 모든 웹사이트를 깨고 있습니다.
물론 그 많은 오작동이 무엇이며 ECMAScript 5가 이를 수정하는 방법에 대해서도 설명합니다.
답변자 : Tân
비교할 작은 예:
엄격하지 않은 모드:
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
답변자 : Oriol
use strict
는 EcmaScript 5 에 도입되었으며 그 이후로 유지되었습니다.
다음은 ES6 및 ES7 에서 엄격 모드를 트리거하는 조건입니다.
- 전역 코드는 Use Strict 지시문이 포함된 지시문 프롤로그로 시작하는 경우 엄격 모드 코드입니다(14.1.1 참조).
- 모듈 코드는 항상 엄격 모드 코드입니다.
- ClassDeclaration 또는 ClassExpression 의 모든 부분은 엄격 모드 코드입니다.
- Eval 코드는 Use Strict 지시문이 포함된 지시문 프롤로그로 시작하거나 eval 호출이 엄격 모드 코드에 포함된 직접 평가(12.3.4.1 참조)인 경우 엄격 모드 코드입니다.
- 연결된 FunctionDeclaration, FunctionExpression, GeneratorDeclaration, GeneratorExpression, MethodDefinition 또는 ArrowFunction 이 엄격 모드 코드에 포함되어 있거나 함수의 [[ECMAScriptCode]] 내부 슬롯 값을 생성하는 코드가 지시문 프롤로그로 시작하는 경우 함수 코드는 엄격 모드 코드입니다. Use Strict Directive가 포함되어 있습니다.
- 내장 Function 및 Generator 생성자에 대한 인수로 제공되는 함수 코드는 마지막 인수가 처리될 때 Use Strict 지시문이 포함된 지시문 프롤로그로 시작 하는 FunctionBody인 문자열인 경우 엄격 모드 코드입니다.
답변자 : Pritam Banerjee
"use strict"
사용해야 하는 주된 이유는 다음과 같습니다.
전역 변수의 우발적인 선언을 방지합니다. "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'}; }
- 주의:
"use strict"
지시어는 스크립트나 함수의 시작 부분에서만 인식됩니다. 문자열 "arguments"
는 변수로 사용할 수 없습니다.
"use strict"; var arguments = 3.14; // This will cause an error
키워드를 변수로 사용하는 것을 제한합니다. 사용하려고 하면 오류가 발생합니다.
간단히 말해서 코드를 오류가 덜 발생하게 만들고 좋은 코드를 작성하게 합니다.
자세한 내용은 여기 를 참조하십시오.
답변자 : Rabin Pantha
JavaScript "strict" 모드는 ECMAScript 5에서 도입되었습니다.
(function() { "use strict"; your code... })();
"use strict";
쓰기; JS 파일의 맨 위에서 엄격한 구문 검사를 켭니다. 우리를 위해 다음 작업을 수행합니다.
선언되지 않은 변수에 할당하려고 하면 오류가 표시됩니다.
주요 JS 시스템 라이브러리를 덮어쓰지 못하도록 합니다.
일부 안전하지 않거나 오류가 발생하기 쉬운 언어 기능을 금지합니다.
use strict
는 개별 함수 내에서도 작동합니다. 코드에 use strict
를 포함하는 것이 항상 더 나은 방법입니다.
브라우저 호환성 문제: "use" 지시문은 이전 버전과 호환됩니다. 지원하지 않는 브라우저는 더 이상 참조되지 않는 문자열 리터럴만 보게 됩니다. 그래서 그들은 그것을 넘어 계속 나아갈 것입니다.
답변자 : Просто программист
use strict
는 예상대로 작동하지 않을 수 있는 위험한 기능을 사용할 수 없기 때문에 코드를 더 안전하게 만드는 방법입니다. 그리고 이전에 작성된 것처럼 코드를 더 엄격하게 만듭니다.
답변자 : PippoApps.com
"엄격한 사용"; JavaScript를 좀 더 강력하게 만들기 위한 ECMA의 노력입니다. 이것은 JS를 최소한 "엄격"하게 만들려는 시도를 가져옵니다(다른 언어는 90년대 이후로 엄격한 규칙을 구현함). 실제로 JavaScript 개발자가 일종의 코딩 모범 사례를 따르도록 "강요"합니다. 그러나 JavaScript는 매우 취약합니다. 유형이 지정된 변수, 유형이 지정된 메소드 등과 같은 것은 없습니다. JavaScript 개발자는 Java 또는 ActionScript3와 같은 보다 강력한 언어를 배우고 JavaScript 코드에서 동일한 모범 사례를 구현하는 것이 좋습니다. 디버그.
답변자 : Bikash Chapagain
일반적으로 JavaScript는 엄격한 규칙을 따르지 않으므로 오류 가능성이 높아집니다. "use strict"
사용한 후 JavaScript 코드는 종료자 사용, 초기화 전 선언 등과 같은 다른 프로그래밍 언어에서와 같이 엄격한 규칙 집합을 따라야 합니다.
"use strict"
규칙 집합을 따라 코드를 작성해야 하므로 오류 및 모호성의 가능성이 줄어듭니다.
답변자 : Wesam
Use Strict는 일반적이고 반복되는 오류를 표시하는 데 사용되어 다르게 처리되고 Java 스크립트가 실행되는 방식을 변경합니다. 이러한 변경 사항은 다음과 같습니다.
우발적인 전역 방지
중복 없음
제거
이 강제를 제거합니다.
안전한 평가()
불변 오류
자세한 내용은 이 기사 를 읽을 수도 있습니다.
답변자 : Ashish
"엄격한 사용"; JavaScript 코드가 "엄격한 모드"에서 실행되어야 함을 정의합니다.
- "use strict" 지시문은 ECMAScript 버전 5의 새로운 기능입니다.
- 이것은 문이 아니라 이전 버전의 JavaScript에서 무시되는 리터럴 표현식입니다.
- "use strict"의 목적은 코드가 "strict 모드"에서 실행되어야 함을 나타내는 것입니다.
- 엄격 모드에서는 예를 들어 선언되지 않은 변수를 사용할 수 없습니다.
모든 최신 브라우저는 Internet Explorer 9 이하를 제외한 "엄격한 사용"을 지원합니다.
불리
개발자가 엄격 모드에 있는 라이브러리를 사용했지만 개발자가 일반 모드에서 작업하는 데 익숙한 경우 예상대로 작동하지 않는 라이브러리에서 일부 작업을 호출할 수 있습니다.
설상가상으로 개발자가 일반 모드에 있기 때문에 추가 오류가 발생하는 이점이 없으므로 오류가 자동으로 실패할 수 있습니다.
또한 위에 나열된 대로 엄격 모드는 특정 작업을 수행하지 못하게 합니다.
사람들은 일반적으로 처음부터 그런 것들을 사용하면 안 된다고 생각하지만 일부 개발자는 제약 조건이 마음에 들지 않고 언어의 모든 기능을 사용하고 싶어합니다.
답변자 : Jerin K Alexander
엄격 모드는 메모리 누수를 방지할 수 있습니다.
비 엄격 모드에서 작성된 아래 기능을 확인하십시오.
function getname(){ name = "Stack Overflow"; // Not using var keyword return name; } getname(); console.log(name); // Stack Overflow
이 함수에서는 함수 name
이라는 변수를 사용하고 있습니다. 내부적으로 컴파일러는 특정 함수 범위에 해당 특정 이름으로 선언된 변수가 있는지 먼저 확인합니다. 컴파일러는 그러한 변수가 없다는 것을 이해했기 때문에 외부 범위에서 확인할 것입니다. 우리의 경우 전역 범위입니다. 다시 말하지만, 컴파일러는 해당 이름으로 전역 공간에 선언된 변수가 없다는 것을 이해하므로 전역 공간에서 우리를 위해 그러한 변수를 생성합니다. 개념적으로 이 변수는 전역 범위에서 만들어지고 전체 응용 프로그램에서 사용할 수 있습니다.
또 다른 시나리오는 변수가 자식 함수에서 선언된 경우입니다. 이 경우 컴파일러는 외부 범위, 즉 부모 함수에서 해당 변수의 유효성을 확인합니다. 그래야만 전역 공간을 확인하고 거기에 변수를 생성합니다. 즉, 추가 확인이 필요합니다. 이것은 응용 프로그램의 성능에 영향을 미칩니다.
이제 엄격 모드에서 동일한 기능을 작성해 보겠습니다.
"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
여기에서 컴파일러는 참조 오류를 발생시킵니다. 엄격 모드에서 컴파일러는 변수를 선언하지 않고 사용하는 것을 허용하지 않습니다. 따라서 메모리 누수를 방지할 수 있습니다. 또한 더 최적화된 코드를 작성할 수 있습니다.
답변자 : mishsx
엄격 모드는 비-엄격 모드에서 무시되는 오류를 제거하여 자바스크립트를 "더 안전하게" 만듭니다.
모범 사례 중 하나로 간주됩니까?
예 , Strict 모드 를 포함하기 위해 javascript로 작업하는 동안 모범 사례의 일부로 간주됩니다. 이것은 JS 파일에 아래 코드 줄을 추가하여 수행됩니다.
'use strict';
당신의 코드에서.
사용자 에이전트에게 이것은 무엇을 의미합니까?
코드가 엄격 모드에서 해석되어야 함을 나타내는 것은 브라우저와 같은 사용자 에이전트가 코드를 문자 그대로 작성된 것으로 취급해야 하고 코드가 이해가 되지 않으면 오류를 발생하도록 지정합니다.
예를 들면 .js
파일에 다음 코드가 있다고 가정합니다.
시나리오 1: [엄격한 모드 없음]
var city = "Chicago" console.log(city) // Prints the city name, ie Chicago
시나리오 2: [엄격한 모드 없음]
city = "Chicago" console.log(city) // Prints the city name, ie Chicago
그렇다면 두 경우 모두 변수 이름이 인쇄되는 이유는 무엇입니까?
엄격 모드가 켜지지 않으면 사용자 에이전트는 종종 문제가 있는 코드를 이해하기 위해 일련의 수정을 거칩니다. 표면적으로는 괜찮은 것처럼 보일 수 있으며, 실제로 엄격 모드 외부에서 작업하면 사람들이 모든 세부 사항을 완전히 정리하지 않고도 JavaScript 코드에 흠뻑 젖을 수 있습니다. 그러나 개발자로서 나는 내 코드에 버그를 남기고 싶지 않습니다. 왜냐하면 버그가 나중에 다시 와서 저를 물어뜯을 수 있다는 것을 알고 있고 또한 좋은 코드를 작성하고 싶기 때문입니다. 그리고 그것이 엄격 모드가 도움이 되는 곳입니다.
시나리오 3: [엄격한 모드]
'use strict'; city = "Chicago" console.log(city) // Reference Error: asignment is undeclared variable city.
추가 팁: 엄격 모드를 사용하여 코드 품질을 유지하려면 특히 .js
파일이 여러 개인 경우 이를 반복해서 작성할 필요가 없습니다. 다음과 같이 eslint
규칙에서 이 규칙을 전역적으로 시행할 수 있습니다.
파일 이름: .eslintrc.js
module.exports = { env: { es6: true }, rules : { strict: ['error', 'global'], }, };
자, 엄격 모드에서 방지되는 것은 무엇입니까?
선언하지 않고 변수를 사용하면 엄격 모드에서 오류가 발생합니다. 이는 애플리케이션 전체에서 의도하지 않게 전역 변수를 생성하는 것을 방지하기 위한 것입니다. Chicago를 인쇄하는 예는 특히 이것을 다룹니다.
변수, 함수 또는 인수를 삭제하는 것은 엄격 모드에서 금지입니다.
"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 언어의 예약어 는 엄격 모드에서 허용되지 않습니다. 단어는 구현 인터페이스, let, packages, private, protected, public입니다. 정적 및 수율
더 포괄적인 목록을 보려면 여기에서 MDN 문서를 확인하십시오. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode
답변자 : snnsnn
JavaScript는 브라우저 전쟁과 잘못된 관리로 인해 성급하게 설계 및 구현되었습니다. 결과적으로 많은 잘못된 디자인 결정, 직관적이지 않은 구문 및 혼란스러운 의미 체계가 언어에 적용되었습니다. 엄격 모드는 이러한 실수 중 일부를 수정하는 것을 목표로 합니다.
그러나 대체 해석을 만들지 않고 이러한 실수를 수정하면 이전 버전과의 호환성이 깨집니다. 따라서 "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
전역 개체가 이미 범위에서 사용할 수 있기 때문에 의미가 더 목적을 제공하지 않습니다 전역 객체를 해결합니다.
엄격 모드에서는 this
우리가 기대하는 것입니다 정의에 전역 함수의 결의에.
"use strict" function run() { console.log(this); } run(); // undefined
"strict mode"
지시문을 무시하기 때문에 이전 브라우저에서 구문이 유효해야 하기 때문에 strict 모드에서도 수정할 수 없습니다. 이것은 의도적으로 설계된 것입니다.
출처 : Here
출처 : http:www.stackoverflow.com/questions/1335851/what-does-use-strict-do-in-javascript-and-what-is-the-reasoning-behind-it">