>  기사  >  웹 프론트엔드  >  JavaScript 엄격 모드가 With 문을 비활성화하는 이유

JavaScript 엄격 모드가 With 문을 비활성화하는 이유

巴扎黑
巴扎黑원래의
2017-09-19 11:32:481665검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.