0

Proxy捕获一个分配并且不确认它时,在严格模式的情况下TypeError被抛出。但我会滥用代理并需要一个ReferenceError

我怎样才能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:同样的问题在俄语中。

4

1 回答 1

0

严格模式ReferenceError仅在没有这样的变量时发生a。在with ({a: …}) a = …;中,总是有一个。仅拦截分配的对象周围的代理不会对此进行任何更改。

您唯一能做的就是a从您的对象中删除该属性,或者让您的代理表现得好像它没有这样的属性:new Proxy({a: …}, {has(){ return false; }}). 这两者都将导致ReferenceError严格模式。然而,这也意味着在草率模式下,它们将导致创建一个全局变量,这可能是不希望的。

严格模式TypeError仅在变量被视为不可变时发生,例如const,对于with语句,不可写属性 - 具有 的数据属性writable: false,没有设置器的附属属性,或任何其他对象(如[[Set]]返回的代理) false。为避免这种情况,return true请从set陷阱中或使用在目标对象上分配属性的默认陷阱。

这两个例外是唯一依赖于严格模式的例外,您不能拦截它们,只能通过代理的其他行为引导它们。当然,你也可以从你的陷阱中抛出异常,但这些不依赖于严格模式。

于 2017-10-10T22:35:40.843 回答