ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScriptのwith文の使い方について_javascriptのヒント

JavaScriptのwith文の使い方について_javascriptのヒント

WBOY
WBOYオリジナル
2016-05-16 18:06:431046ブラウズ

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 内の内部変数を使用して値を変更してみましょう。ステートメント



コードをコピー コードは次のとおりです。 var root = {
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 ステートメント

内のオブジェクトの親ノードを通じて値を変更します。

コードをコピーします

コードは次のとおりです: var root = { branch: { node: 1 }
};

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 ステートメントを使用する人はほとんどいないと思います。というキーワードですが、これは問題のある発言であり、絶対に使ってはいけないと感じたので、記録のために短い記事を書きました。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。