当top_r_cuisine
捕获一个赋值但未确认它时,如果出现严格模式,则抛出Proxy
。但是我要滥用代理,而是需要TypeError
。
如何在第二次通话中获得ReferenceError
?
ReferenceError
答案 0 :(得分:0)
严格模式ReferenceError
仅在没有此类变量a
时才会发生。在with ({a: …}) a = …;
,总有一个。围绕仅截取分配的对象的代理不会改变任何相关内容。
您唯一能做的就是从对象中删除a
属性,或让代理行为就好像它没有这样的属性:new Proxy({a: …}, {has(){ return false; }})
。这两者都将以严格模式导致ReferenceError
。但是,这也意味着在草率模式下,它们将导致创建一个全局变量,这可能是不可取的。
严格模式TypeError
仅在变量被视为不可变时发生,例如const
或with
语句,不可写属性 - 具有writable: false
的数据属性,没有setter的附件属性,或任何其他对象,如{{ {1}}返回[[Set]]
。要避免它,false
陷阱中的return true
或使用在目标对象上分配属性的默认陷阱。
这两个例外是唯一依赖于严格模式的例外,你不能拦截它们,而只能引导它们通过代理的其他行为。当然,您也可以从陷阱中抛出异常,但这些异常不依赖于严格模式。