을 사용해도 'use strict';
코드가 갑자기 나아지는 것은 아닙니다.
자바 스크립트 엄격 모드는 기능입니다 인 ECMAScript 5 . 스크립트 / 함수 맨 위에 이것을 선언하여 엄격 모드를 활성화 할 수 있습니다.
'use strict';
JavaScript 엔진이이 지시문을 보면 특수 모드에서 코드를 해석하기 시작합니다. 이 모드에서는 잠재적 인 버그가 될 수있는 특정 코딩 방법이 감지 될 때 오류가 발생합니다 (엄격 모드의 원인).
이 예제를 고려하십시오.
var a = 365;
var b = 030;
숫자 리터럴을 정렬하는 것에 대한 집착으로 개발자는 실수로 변수 b
를 8 진 리터럴 로 초기화했습니다 . 엄격하지 않은 모드는이 값을 24
10을 기준 으로 값이있는 숫자 리터럴로 해석합니다 . 그러나 엄격 모드에서는 오류가 발생합니다.
엄격 모드의 비전문가 목록은 이 답변을 참조하십시오 .
어디에서 사용해야 'use strict';
합니까?
내에서 새로운 자바 스크립트 응용 프로그램 : 물론! 엄격한 모드는 코드로 바보 같은 일을 할 때 내부 고발자로서 사용될 수 있습니다.
내에서 기존의 자바 스크립트 코드 : 아마 아닙니다! 기존 JavaScript 코드에 엄격 모드에서 금지 된 명령문이있는 경우 애플리케이션이 중단됩니다. 엄격 모드를 원하면 기존 코드를 디버그하고 수정할 준비가되어 있어야합니다. 이것이 사용 'use strict';
이 갑자기 코드를 향상시키지 않는 이유 입니다.
엄격 모드는 어떻게 사용합니까?
'use strict';
스크립트 위에 문장을 삽입하십시오 .
// File: myscript.js
'use strict';
var a = 2;
....
파일의 모든 내용 myscript.js
은 엄격 모드로 해석됩니다.
또는 'use strict';
함수 본문 위에 명령문을 삽입 하십시오.
function doSomething() {
'use strict';
...
}
어휘 기능 범위 의 모든 내용은 doSomething
엄격 모드에서 해석됩니다. 어휘 범위 라는 단어 가 여기서 중요합니다. 예를 들어, 엄격한 코드가 엄격 하지 않은 라이브러리의 함수를 호출하면 코드 만 호출 된 함수가 아닌 엄격 모드로 실행됩니다. 자세한 설명 은 이 답변 을 참조하십시오 .
엄격 모드에서 금지 된 사항은 무엇입니까?
엄격한 모드에서 금지 된 몇 가지 사항을 설명 하는 멋진 기사 를 찾았습니다 (이 목록은 독점 목록이 아닙니다).
범위
역사적으로 JavaScript는 함수의 범위를 지정하는 방법에 대해 혼란 스러웠습니다. 때로는 정적으로 범위가 지정된 것처럼 보이지만 일부 기능은 동적으로 범위가 지정된 것처럼 동작합니다. 혼란 스럽기 때문에 프로그램을 읽고 이해하기가 어렵습니다. 오해로 인해 버그가 발생합니다. 성능 문제이기도합니다. 정적 범위 지정은 컴파일 타임에 변수 바인딩이 발생하도록 허용하지만 동적 범위에 대한 요구 사항은 바인딩이 런타임으로 지연되어야한다는 것을 의미하며 이는 상당한 성능 저하가 따릅니다.
엄격 모드에서는 모든 변수 바인딩을 정적으로 수행해야합니다. 즉, 이전에 동적 바인딩이 필요한 기능을 제거하거나 수정해야합니다. 특히 with 문이 제거되고 호출자의 환경을 변경하는 eval 함수의 기능이 심각하게 제한됩니다.
엄격한 코드의 장점 중 하나는 YUI Compressor 와 같은 도구
가 처리 할 때 더 나은 작업을 수행 할 수 있다는 것입니다.
내재 된 글로벌 변수
JavaScript는 전역 변수를 암시했습니다. 변수를 명시 적으로 선언하지 않으면 전역 변수가 암시 적으로 선언됩니다. 이를 통해 초보자는 기본 하우스 키핑 작업을 무시할 수 있으므로 프로그래밍이 쉬워집니다. 그러나 큰 프로그램을 관리하기가 훨씬 어려워지고 안정성이 크게 저하됩니다. 따라서 엄격 모드에서는 내재 된 전역 변수가 더 이상 생성되지 않습니다. 모든 변수를 명시 적으로 선언해야합니다.
글로벌 누출
this
전역 객체에 바인딩 될 수있는 여러 상황이 있습니다 . 예를 들어 new
생성자 함수를 호출 할 때 접두사 를 제공하지 않으면 생성자가 this
전역 객체에 예기치 않게 바인딩되므로 새 객체를 초기화하는 대신 전역 변수가 자동으로 변경됩니다. 이러한 상황에서는 엄격 모드가 대신에 바인딩 this
되어 undefined
생성자가 대신 예외를 throw하여 오류를 훨씬 빨리 감지 할 수 있습니다.
시끄러운 실패
JavaScript에는 항상 읽기 전용 속성이 있었지만 ES5의 Object.createProperty
기능이 해당 기능을 노출 할 때까지 직접 만들 수 없었습니다 . 읽기 전용 속성에 값을 할당하려고하면 자동으로 실패합니다. 할당은 속성 값을 변경하지 않지만 프로그램은 마치 그대로 진행됩니다. 이는 프로그램이 일관성이없는 상태가 될 수있는 무결성 위험입니다. 엄격 모드에서는 읽기 전용 속성을 변경하려고하면 예외가 발생합니다.
옥탈
숫자의 8 진법 (또는 8 진법)은 단어 크기가 3의 배수 인 기계에서 기계 수준 프로그래밍을 수행 할 때 매우 유용했습니다. 단어 크기가 60 비트 인 CDC 6600 메인 프레임으로 작업 할 때는 8 진법이 필요했습니다. 8 진수를 읽을 수 있다면 단어를 20 자리로 볼 수 있습니다. 2 자리 숫자는 op 코드를 나타내고 1 자리 숫자는 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
추가 자료