Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测javascript中何时设置了全局变量?_Javascript_Ecmascript 6 - Fatal编程技术网

如何检测javascript中何时设置了全局变量?

如何检测javascript中何时设置了全局变量?,javascript,ecmascript-6,Javascript,Ecmascript 6,在javascript中,我可以使用对象检测全局变量foo何时被设置(假设它最初未定义)。defineProperty: var foo_; Object.defineProperty(window, 'foo', { get: function() { return foo_; }, set: function(newFoo) { console.log('foo set to ' + newFoo); foo_ = newFoo; } }); 有没有

在javascript中,我可以使用
对象检测全局变量
foo
何时被设置(假设它最初未定义)。defineProperty

var foo_;
Object.defineProperty(window, 'foo', {
  get: function() {
    return foo_;
  },
  set: function(newFoo) {
    console.log('foo set to ' + newFoo);
    foo_ = newFoo;
  }
});
有没有更优雅的方法?一个缺点是我不能对同一个属性调用两次
Object.defineProperty
。重写整个属性只是为了检测它何时被定义似乎有点过分

我能用点什么吗?我觉得我必须做一个代理,以窗口对象为目标,尽管。。。这有效吗?

您也可以这样做

var _bar;
window.__defineGetter__("bar", function(){return this._bar});
window.__defineSetter__("bar", function(v){console.log("bar set to:",v); this._bar = v;});
有没有更优雅的方法

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

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

唯一的问题是你忘了

我可以用代理吗


不可以。不能用代理替换全局对象。你唯一能做的就是用(newproxy(…){…}块将所有代码包装在
中。

我想我们可以检查它是否在窗口对象中可用,比如
window[foo]
我想检测设置全局变量的时刻,并在那个时候说log。这感觉像是一种异步攻击。如果是,就不要做。如果您将其用于调试,请使用
Promise
——如果您不能设置两次,那么这又有什么关系呢?如果您不是为了调试而使用它-最好不要。我是为了调试而检测,但另一个库已经对该属性调用了
Object.defineProperty
。不要使用不推荐使用的和非标准的内置项。