Java 및 .NET을 사용해 본 학생들은 패키지나 네임스페이스의 개념에 익숙해야 합니다. 이 개념으로 인해 코드의 단순성과 가독성이 보장됩니다. JavaScript의 시작 부분에 with 문이 어떻게 배치되었는지 알 수 없습니다. 개인적으로는 어느 정도 유사성이 있다고 생각합니다. 예를 들면
apple .banana.candy.dog.egg.fog.god.huh.index = 0
doSomething(apple.banana.candy.dog.egg.fog.god.huh .index);
with 문을 사용하면 다음과 같은 코드로 작성할 수 있습니다.
with(apple.banana.candy.dog.egg.fog.god.huh) {
c = 0
doSomething( index);
멋져 보이지만 치명적인 결함이 있습니다.
1. 구문
var root = {
branch : {
node: 1
}
};
with(root.branch) {
node = 0
// 0을 표시합니다.
Alert(node);
}
// 0을 표시합니다!
alert(root.branch.node)
2. with 문
var root = {
branch: {
노드: 1
}
};
with(root.branch) {
root.branch.node = 0
// 0 표시 , 맞습니다!
}
// 0을 표시합니다.
alert(root.branch.node)
테스트 1 후 테스트 2는 얼핏 보면 문제가 없지만... 테스트 3을 봐주세요.
3. with 문 내부의 객체 부모 노드를 통해 값을 수정합니다
var root = {
branch: {
node: 1
}
};
with(root.branch) {
root.branch = {
node: 0
}// 1 표시, 틀렸습니다!
alert(node);
}
// 0을 표시합니다.
alert(root.branch.node);
위에서 볼 수 있습니다. 테스트 3에서는 with 문 내부 노드의 상위 노드가 수정된 후에는 노드 자체와 동기화되지 않습니다. 즉, 내부 값과 외부 값의 일관성을 보장할 수 없다는 문제가 발생할 수 있습니다. 프로젝트에 고도로 숨겨진 버그가 있습니다.
그렇다면 어떻게 해야 할까요? 긴 일련의 단계별 접근을 받아들여야 할까요, 아니면 다른 방법이 있을까요?
참고할 수 있는 방법이 있을까요? 별칭을 통해 노드 개체를 다음과 같이 상위 노드로 호출합니다.
분기: {
노드: 1
}
}
var quote = root.branch
quote.node; = 0;
/ / 0을 표시합니다!
alert(root.branch.node)
with 문을 사용하는 사람은 거의 없을 것이라고 생각합니다. 이 키워드는 문제가 있는 표현이고 전혀 사용되어서는 안된다고 느껴서 이를 기록하기 위해 짧은 글을 썼습니다.