私は厳格なJavaScriptモードを何度も読みましたが、「ステートメントで無効にする」と言う人もいます。過去には、馬に乗って花を見ることでこれをすべて見て、通り過ぎました。なぜなら、私は通常の時代にはめったにこの声明を使用しないので、自分とはあまり関係がないからです。今日、私は「厳格なモデル」が声明を容認できない理由を疑問に思わずにはいられませんか?
ECMAScriptの仕様には、「ステートメントは特定のオブジェクトにコードの範囲を設定するために使用されます」と述べています。ステートメントを使用すると、スコープチェーンが変更されることがわかります。
function person(name、age、sex){this.name = name; this.age = age; this.sex = sex;}(var title = 'applicant:'; var zhangsan = new person( 'zhang san'、 'male'); var str = ''; position '+job;} console.log(str);})();上記のコードでは、職人の参照エラーを報告します:ジョブは定義されていません。
ステートメントブロックがある上記の場合は、に変更されている場合
str = title+zhangsan.name+'、age'+zhangsan.age+'year、'+zhangsan.sex+'sex'+'、position'+zhangsan.job;
エラーはありません、出力は次のとおりです。申請者:Zhang San、20歳、男性、未定義の位置
ステートメントブロックの変数の場合、実行するときは、それらのプロパティがZhangsanにあるかどうかを確認する必要があります。
スクリプトを実行するとき、最初にコンパイルしてから実行する必要がある2つのプロセスがあることを知っています。
明らかに、コンパイルするとき、Zhangsanのこの変数で表されるオブジェクトがどのようなプロパティを持っているかを決定することはできません。 Zhangsanは処刑されたときに人の例であると判断することができます。したがって、withステートメントブロックの変数が、コンパイル中の以前の変数スコープチェーンのZhangsanまたは変数のプロパティであることは事実ではありません。
これは、Strictモードをコンパイルするときに変数が定義されるという事実と競合するため、厳密なモードでは違いが存在しません。したがって、withステートメントが厳密なモードで無効になっていることを理解することは難しくありません。