JavaScript 엄격 모드를 여러 번 읽었는데 그 중 하나가 "With 문을 비활성화합니다"라고 말했습니다. 오늘은 왜 "엄격 모드"가 with 문을 허용할 수 없는지 궁금합니다.
저는 JavaScript Strict를 여러 번 읽었는데 그 중 하나에 "With 문을 비활성화합니다"라고 나와 있습니다. 예전에는 이 문이 꽃을 관찰하는 것으로만 보고 지나쳤습니다. 비활성화할 수 없다면 나에게는 별로 중요하지 않습니다. 오늘은 왜 "엄격 모드"가 with 문을 수용할 수 없는지 궁금합니다.
EcmaScript 사양에는 "with 문은 특정 개체에서 코드의 범위를 설정하는 데 사용됩니다."라고 나와 있습니다. With 문은 범위 체인을 변경하는 것을 볼 수 있습니다.
function Person(name,age,sex){ this.name = name; this.age = age; this.sex = sex; } (function(){ var title = '申请人:'; var zhangsan = new Person('张三',20,'男'); var str = ''; with(zhangsan){ str = title+name+',年龄'+age+'岁,'+sex+'性'+',职位'+job; } console.log(str); })();
위 코드는 Uncaught ReferenceError: 작업이 정의되지 않음을 보고합니다.
위의 with 문 블록을
str = title+zhangsan.name+', age'+zhangsan.age+'years old,'+zhangsan.sex+'sex'+', position'+zhangsan.job;으로 변경하면
오류는 보고되지 않으며 출력 str은 다음과 같습니다. 신청자: Zhang San, 20세, 남성, 위치 정의되지 않음
with 문 블록의 변수에 대해 실행 시 해당 속성이 zhangsan에 있는지 확인하세요.
우리는 스크립트를 실행할 때 먼저 컴파일하고 실행하는 두 가지 프로세스가 필요하다는 것을 알고 있습니다.
분명히 컴파일 중에는 zhangsan 변수가 나타내는 개체가 어떤 속성을 가지고 있는지 확인할 수 없습니다. zhangsan이 Person의 인스턴스라는 것은 실행 시에만 결정될 수 있습니다. 따라서 with 문 블록의 변수가 zhangsan의 속성인지 상위 변수 범위 체인의 변수인지 컴파일 타임에 확인할 수 없습니다.
이것은 컴파일 타임에 변수가 정의되었는지 확인하는 strict 모드와 충돌하므로 strict 모드는 차이가 존재하는 것을 허용하지 않으므로, strict 모드에서는 With 문을 비활성화한다는 것을 이해하는 것은 어렵지 않습니다.
위 내용은 JavaScript 엄격 모드가 With 문을 비활성화하는 이유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!