이 기사에서는 엄격 모드와 관련된 문제를 주로 소개하는 JavaScript에 대한 관련 지식을 제공합니다. 엄격 모드는 코드를 암시적으로 "지연 모드"에서 벗어나게 하는 제한적인 JavaScript 모드입니다. 모든 사람에게 도움이 되기를 바랍니다.
[관련 권장사항: 자바스크립트 동영상 튜토리얼, 웹 프론트엔드]
ECMAScript5 표준에서 JavaScript는 엄격 모드 개념을 제안했습니다.
엄격 모드는 이해하기 쉽습니다. 이는 코드가 암시적으로 "게으른 모드"에서 벗어나도록 만드는 제한적인 JavaScript 모드입니다.
엄격 모드를 지원하는 브라우저는 코드에서 엄격 모드를 감지하면 보다 엄격한 방식으로 코드를 감지하고 실행합니다.
엄격 모드는 일반적인 JavaScript 의미 체계에 몇 가지 제한 사항을 적용합니다.
엄격 모드에서는 원래 자동 오류 중 일부를 발생 시켜 제거합니다.
엄격 모드를 사용하면 JS 엔진이 코드를 실행할 때 (특수 구문을 처리할 필요 없이) 더 많은 최적화를 수행할 수 있습니다.
엄격 모드는 ECMAScript의 향후 버전에서 정의될 수 있는 일부 구문을 비활성화합니다.
그렇다면 엄격 모드를 활성화하는 방법은 무엇입니까? 엄격 모드는 세분화된 마이그레이션을 지원합니다.
js 파일에서 엄격 모드 활성화를 지원할 수 있습니다.
또한 특정 기능에 대해 엄격 모드를 활성화하는 것도 지원합니다.
JavaScript는 초보 개발자가 사용하기 쉽도록 설계되었기 때문에 구문이 잘못된 경우도 있지만 정상적으로 구문 분석할 수는 없을 것 같습니다.
그러나 이 방법은 보안 위험을 초래할 수 있습니다.
엄격 모드에서는 이러한 종류의 트랜잭션을 오류로 처리하여 신속하게 발견하고 수정할 수 있습니다.
다음은 몇 가지 일반적인 제한사항을 요약한 것입니다.
실수로 전역 변수를 만드는 방법에는 두 가지가 있습니다.
키워드를 사용하지 않고 직접 전역변수를 전역적으로 선언
함수 내에서 키워드를 사용하지 않고 변수를 선언하면 기본적으로 함수가 전역 변수로 승격됩니다. 예제 코드는 다음과 같습니다.
'엄격하게 사용하다' // 실수로 전역 변수 생성을 비활성화합니다. message = '실수로 전역 변수가 생성되었습니다.' console.log(message) //오류 메시지는 다음과 같습니다: Uncaught ReferenceError: 메시지가 정의되지 않았습니다. 함수 foo() { 나이=20 console.log(나이) } foo() // ReferenceError: 나이가 정의되지 않았습니다.
샘플 코드는 다음과 같습니다.
//엄격 모드를 활성화하고 문제를 'use strict' 오류로 직접 변환합니다. const v = 100;//(상수 정의) v = 1.14; //값 재할당(변수에) console.log(v); // 잡히지 않은 TypeError: 상수 변수에 할당되었습니다.
엄격 모드에서는 변수에 선택 취소 연산자를 사용할 수 없습니다.
// 엄격 모드를 켭니다. 'use strict' var v = 100; delete v;//비엄격 모드: 이는 자동 실패이며 오류가 보고되지도 않고 변수 v도 삭제되지 않습니다. console.log(v);//100 //엄격 모드를 켠 후 대신 오류가 보고됩니다. 엄격 모드에서 정규화되지 않은 식별자를 삭제합니다.
엄격 모드에서는 배열 및 메서드 속성에 delete 키워드를 사용하는 것과 동일한 효과가 있습니다.
// 엄격 모드를 켭니다. 'use strict' // 1. 엄격 모드에서 배열 내용 삭제 var arr = [1,2,3,4] 삭제 arr[0]; console.log(arr);//[ <1개의 빈 항목>, 2, 3, 4 ] // 2. 엄격 모드의 삭제 함수 속성 var obj = { 이름 : '돼지맨' } obj.name 삭제; console.log(obj.name)//정의되지 않음
샘플 코드는 다음과 같습니다.
'엄격하게 사용하다' // 동일한 매개변수 이름을 가진 함수는 허용되지 않습니다. function foo2 (x, y, x) { console.log(x, y, x) } foo2(10, 20, 30) // SyntaxError: 이 컨텍스트에서는 중복된 매개변수 이름이 허용되지 않습니다.
샘플 코드는 다음과 같습니다.
// 원래 8진수 형식 var num1 = 0123은 허용되지 않습니다. var num2 = 0o123 // 이 형식으로 8진수로 작성할 수 있습니다. var num3 = 0x123 // 이 형식으로 16진수로 작성할 수 있습니다. var num4 = 0b100 // 이 형식으로 바이너리로 작성할 수 있습니다. console.log(num1) // 구문 오류: 엄격 모드에서는 8진수 리터럴이 허용되지 않습니다. console.log(num2, num3, num4) // 83 291 4
샘플 코드는 다음과 같습니다.
'엄격하게 사용하다' var message = '안녕하세요 월드'; var obj = { 이름: '잼', 나이: 20 } //with 문은 자체 범위를 형성할 수 있습니다. with 문에서 age를 인쇄하면 obj 객체의 age 속성이 출력되지만, with 문에 존재하지 않는 속성 메시지가 인쇄되면 출력됩니다. 한 수준은 외부 범위에 있습니다. 함수 foo() {를 찾기 위한 한 수준입니다. (obj)와 함께 { console.log(나이) console.log(메시지) } console.log(메시지) } foo() // 구문 오류: 엄격 모드 코드에는 with 문이 포함되지 않을 수 있습니다.
샘플 코드는 다음과 같습니다.
var jsString = "var message = 'hello world';console.log(message)" eval(jsString) // hello world 출력 console.log(message) //오류 메시지: ReferenceError: 메시지가 정의되지 않았습니다.
开启严格模式eval函数不会向上引用变量所以全局作用域就没有message这个变量所以会报错
샘플 코드는 다음과 같습니다.
'엄격하게 사용하다' // 엄격 모드에서는 자체 실행 함수(기본 바인딩)가 정의되지 않음을 가리키고, 비엄격 모드에서는 창을 가리킵니다. 함수 foo() { console.log(이것) } foo() // 정의되지 않음