JavaScript の厳密モードについては何度も読みましたが、そのうちの 1 つに「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: job is not generated」を報告します。
上記の with ステートメントブロックを
に変更するとstr = title zhangsan.name ', age' zhangsan.age 'years,' zhangsan.sex 'sex' ', 役職' zhangsan.job;
エラーは報告されず、出力文字列は次のとおりです: 応募者: Zhang San、20 歳、男性、職位は未定義
with ステートメントブロック内の変数については、実行時にその属性が zhangsan にあるかどうかを確認します。
スクリプトを実行する場合、最初にコンパイルし、次に実行という 2 つのプロセスが必要であることがわかっています。
明らかに、コンパイル時には、変数 zhangsan によって表されるオブジェクトがどのような属性を持っているかを判断することはできません。 zhangsan が person のインスタンスであるかどうかは、実行時にのみ判断できます。したがって、with ステートメント ブロック内の変数が zhangsan の属性であるか、上位レベルの変数スコープ チェーン内の変数であるかをコンパイル時に確認することはできません。
これは、変数がコンパイル時に定義されているかどうかをチェックする厳密モードと競合するため、厳密モードでは差異の存在が許可されません。そのため、厳密モードが With ステートメントを無効にすることを理解するのは難しくありません。