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;
}
素晴らしいですね。しかし、致命的な欠陥があります。
1 内の内部変数を使用して値を変更してみましょう。ステートメント
branch : {
node: 1
}
};
with(root.branch) {
node = 0;
// 0 を表示します、正解です! alert(node);
}
// 0 を表示します。
alert(root.branch.node);
2 内のオブジェクト ノードを使用して値を変更します。 with ステートメント
コードをコピー
node: 1
}
};
with(root.branch) {
root.branch.node = 0; 、正しいです!
alert(node);
}
// 0 を表示します。
テスト 1 の後テスト 2 は一見問題ありませんが... テスト 3 を見てください。
3. with ステートメント
内のオブジェクトの親ノードを通じて値を変更します。
コードをコピーします
};
with(root.branch) {
root.branch = {
node: 0
}; 1 を表示します、間違っています。
alert(node);
}
// 0 を表示します。
alert(root.branch.node); 上記からわかります。テスト 3 では、with ステートメント内のノードの親ノードが変更された後、ノード自体に同期されなくなります。つまり、内部値と外部値の整合性が保証されないことが問題になる可能性があります。プロジェクト内に非常に隠されたバグがあります。
それでは、長いステップバイステップのアクセスを受け入れる必要がありますか?
それを参照する方法があります。エイリアスを介して、次のようにノード オブジェクトを親ノードとして呼び出します。
コードをコピーします
コードは次のとおりです:
var root = {
branch: {
node: 1 } }; var quote = root.branch; = 0; / / 0 が表示されます、正しいです!
alert(root.branch.node);
with ステートメントを使用する人はほとんどいないと思います。というキーワードですが、これは問題のある発言であり、絶対に使ってはいけないと感じたので、記録のために短い記事を書きました。