> 웹 프론트엔드 > JS 튜토리얼 > JavaScript 엄격 모드가 With 문_javascript 팁을 비활성화하는 이유

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

WBOY
풀어 주다: 2016-05-16 16:33:19
원래의
1575명이 탐색했습니다.

JavaScript 엄격 모드를 여러 번 읽었는데 그 중 하나에 "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 = 제목 zhangsan.name ', 나이' zhangsan.age '세,' zhangsan.sex '성별' ', 직위' zhangsan.job;

오류는 보고되지 않으며 출력 문자열은 다음과 같습니다. 신청자: Zhang San, 20세, 남성, 직위 미정

with 문 블록의 변수는 실행 시 해당 속성이 zhangsan에 있는지 확인하세요.

우리는 스크립트를 실행할 때 먼저 컴파일하고 실행하는 두 가지 프로세스가 필요하다는 것을 알고 있습니다.
분명히 컴파일 시점에는 zhangsan 변수가 나타내는 개체가 어떤 속성을 가지고 있는지 확인하는 것이 불가능합니다. zhangsan이 Person의 인스턴스라는 것은 실행 시에만 결정될 수 있습니다. 따라서 with 문 블록의 변수가 zhangsan의 속성인지 상위 변수 범위 체인의 변수인지 컴파일 타임에 확인할 수 없습니다.

이것은 컴파일 타임에 변수가 정의되었는지 확인하는 엄격 모드와 충돌하므로 엄격 모드에서는 차이가 존재하는 것을 허용하지 않으므로 엄격 모드에서는 With 문을 비활성화한다는 것을 이해하기 어렵지 않습니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿