【问题标题】:JavaScript try...catch for defineProperty not workingJavaScript try...catch for defineProperty 不起作用
【发布时间】:2016-09-17 15:40:22
【问题描述】:

我想知道当我将Object.defineProperty() 方法与get()set() 一起使用时,为什么在catch 块内没有引发错误?

    try {
      var f;
      Object.defineProperty(window, 'a', {
        get: function() {
          return fxxxxx; // here: undef var but no error catched
        },
        set: function(v) {
          f = v;
        }
      });
    } catch (e) {
      console.log('try...catch OK: ', e);
    }
    
    a = function() {
      return true;
    }
    window.a();

    // Expected output: "try...catch OK: ReferenceError: fxxxxx is not defined"
    // Console output: "ReferenceError: fxxxxx is not defined"

【问题讨论】:

  • 谢谢你,克劳德。很好的答案。
  • 不过,在未来,最好使用 Stack Snippets(<> 工具栏按钮)来创建可运行的现场演示,而不是使用非现场的 jsFiddle。 (我的答案有一个 sn-p,所以你可以看到它们是什么样的。)
  • 我下次再做。谢谢。

标签: javascript try-catch getter-setter defineproperty


【解决方案1】:

创建引用在创建函数时不可解析的符号的函数不是ReferenceError。错误发生稍后,当函数被调用时,如果符号在那个时候是不可解析的。

例如,考虑一下,您可以这样做:

try {
  var f;
  Object.defineProperty(window, 'a', {
    get: function() {
      return fxxxxx;
    },
    set: function(v) {
      f = v;
    }
  });
} catch (e) {
  console.log('try...catch OK: ', e);
}

window.fxxxxx = function() { console.log("Hi there"); };   // <====== Added this

a = function() {
  return true;
}
window.a();

这会记录 "Hi there",因为 fxxxxx 不是在调用 get 函数时无法解析。

【讨论】:

  • @Crowder, @Bergi:谢谢你的解释。此外,当稍后发生错误时,try/catch 对 addEventListener 内的代码执行相同的行为。
  • @poro6 是的,所有函数定义都是一样的。异常是在调用函数时创建的,而不是在创建时创建的。不管这是一个简单的声明,一个getter(就像你的问题)还是一个事件监听器。
  • @Bergi:这对我来说是一条黄金法则。感谢您的意见。
【解决方案2】:

来自@T.J. 的影响。 Crowder 的回答,如果您想尝试捕获该错误,则应按如下方式更改代码;

var f;
  Object.defineProperty(window, 'a', {
    get: function() {
      try {
      return fxxxxx; // here: undef var but no error catched
      }
      catch(e){console.log("i've got it", e)}
    },
    set: function(v) {
      f = v;
    }
  });

a = function() {
  return true;
}
window.a;

【讨论】:

  • 感谢您的建议。我会按照这种方式进行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多