ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript 厳密モードで With ステートメントが無効になる理由

JavaScript 厳密モードで With ステートメントが無効になる理由

巴扎黑
巴扎黑オリジナル
2017-09-19 11:32:481665ブラウズ

私は JavaScript Strict Mode を何度も読みましたが、その中の 1 つが「With ステートメントを無効にする」と書いてあり、なぜ「Strict Mode」が with ステートメントを許容できないのか疑問に思いました。もしあなたが混乱しているなら、次のように考えてください。

私は JavaScript Strict モードを何度も読みましたが、その 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 old,'+zhangsan.sex+'sex'+',position'+zhangsan.job; に変更すると、

エラーは報告されず、出力文字列は次のとおりです: 応募者: Zhang San、20 歳、男性、ポジション未定義

with ステートメント ブロック内の変数については、実行時にその属性が zhangsan にあるかどうかを確認します。

スクリプトを実行する場合、最初にコンパイルし、次に実行という 2 つのプロセスが必要であることがわかっています。
明らかに、コンパイル時には、変数 zhangsan によって表されるオブジェクトがどのような属性を持っているかを判断することはできません。 zhangsan が person のインスタンスであるかどうかは、実行時にのみ判断できます。したがって、with ステートメント ブロック内の変数が zhangsan の属性であるか、上位レベルの変数スコープ チェーン内の変数であるかをコンパイル時に確認することはできません。

これは、コンパイル時に変数が定義されているかどうかをチェックする厳密モードと競合するため、厳密モードでは差異が存在することが許可されないため、厳密モードが With ステートメントを無効にすることを理解するのは難しくありません。

以上がJavaScript 厳密モードで With ステートメントが無効になる理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。