2017-10-10 3 views
0

Proxyが割り当てをトラップし、それを確認しない場合、厳密なモードの場合TypeErrorがスローされます。しかし、私はプロキシを悪用しようとしており、その代わりにReferenceErrorが必要です。代替プロキシ例外

2回目の呼び出しでReferenceErrorを取得するにはどうすればよいですか?

var code = ` 
 
    try { 
 
    a = 1; 
 
    console.log("Ok"); 
 
    } catch (e) { 
 
    console.log(e.name); 
 
    } 
 
`; 
 

 
var p = new Proxy({a:undefined}, {set(){}}); 
 

 
with (p) (function() {    eval(code); })(); // Ok 
 
with (p) (function() { 'use strict'; eval(code); })(); // TypeError 
 
     (function() { 'use strict'; eval(code); })(); // ReferenceError

PS:そのような変数aが存在しない場合にのみ起こるReferenceErrorSame question in Russian.

+1

「新しいReferenceError(...)」をスローするのは機能しますか? – Ryan

+0

「確認しない」とはどういう意味ですか? – Bergi

+0

@Ryan、どのような場所ですか?呼び出し元が厳密なモードになっている場合にのみエラーが必要です。そうしないと何も起こりません。そして 'code'は変更してはいけません。 – Qwertiy

答えて

0

厳密モード。 with ({a: …}) a = …;には常に1つあります。代入を傍受するだけのオブジェクトの周りのプロキシは、これについて何も変更しません。

オブジェクトからaプロパティを削除するか、またはプロキシにそのようなプロパティ(new Proxy({a: …}, {has(){ return false; }}))がないかのように動作させることができます。両方ともstrictモードでReferenceErrorになります。しかし、これはまた、怠惰なモードでは望ましくない可能性のあるグローバル変数の作成につながることを意味します。

厳密モードTypeErrorは、変数が不変であるとみなされる場合にのみ発生します。 constまたはwithステートメントの場合、書込み不可能なプロパティ - writable: falseのデータプロパティ、セッターのないアクセサリプロパティ、または[[Set]]が返すfalseのプロキシのような他のオブジェクト。それを避けるには、setトラップのreturn trueを使用するか、ターゲットオブジェクトのプロパティを割り当てるデフォルトのトラップを使用します。

これらの2つの例外は厳密モードに依存する唯一のものであり、傍受することはできませんが、プロキシの他の動作によってそれらを指示することはできません。もちろん、トラップから例外をスローすることもできますが、厳密なモードには依存しません。

+0

私はスコープの分離に興味があるので、プロキシ(またはその中のキー)を削除することは私が望むものではありません。 – Qwertiy

+0

@Qwertiyグローバル変数のすべてのアクセスを常にスローするだけで何か問題はないとは限りません。スコープを分離する場合は、コードが厳密なモードで実行されるかどうかは関係ありません。宣言されていない変数に割り当てることは常に間違いです。 – Bergi

+0

未割り当て変数の読み取りは常にエラーです。しかし、それの割り当ては厳密なモードでは誤りに過ぎません。 – Qwertiy