如何检测javascript中何时设置了全局变量?
在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; } }); 有没有
对象检测全局变量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
。不要使用不推荐使用的和非标准的内置项。