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 문을 비활성화한다는 것을 이해하기 어렵지 않습니다.