ecmascript 6-如何检测在javascript中设置全局变量

ecmascript 6 - How can I detect when a global variable is set in javascript?

本文关键字:javascript 设置 全局变量 检测 何检测 ecmascript      更新时间:2023-09-26

在javascript中,我可以通过使用Object.defineProperty:来检测全局变量foo何时被设置(假设它最初未定义)

var foo_;
Object.defineProperty(window, 'foo', {
  get: function() {
    return foo_;
  },
  set: function(newFoo) {
    console.log('foo set to ' + newFoo);
    foo_ = newFoo;
  }
});

有更优雅的方法吗?一个缺点是我不能对同一个属性调用Object.defineProperty两次。覆盖整个属性只是为了检测它何时被定义似乎有点过头了。

我可以以某种方式使用代理吗?我觉得我必须制作一个针对窗口对象的代理。。。这样有效吗?

有更优雅的方法吗?

不是。也许您可以(应该)在闭包中隐藏_foo,而不是创建另一个全局变量。

一个缺点是我不能对同一个属性调用Object.defineProperty两次。覆盖整个属性只是为了检测它何时被定义似乎有点过头了。

唯一的问题是您忘记传递configurable: true选项。

我可以以某种方式使用代理吗?

没有。不能用代理替换全局对象。您唯一能做的就是将所有代码封装在with (new Proxy(…)) { … }块中。

您可能也喜欢

var _bar;
window.__defineGetter__("bar", function(){return this._bar});
window.__defineSetter__("bar", function(v){console.log("bar set to:",v); this._bar = v;});