【发布时间】:2012-12-10 21:54:14
【问题描述】:
我在试图回答这个问题时遇到了困难:Explaining odd behavior in javascript。在研究过程中,我发现直接分配给宿主对象的事件处理程序呈现出一种奇怪的行为:它们可以作为对象的属性进行访问,但不知何故,它们似乎不是实际的属性。
例如,如果我在全局范围内定义一个变量,它看起来就像window 的任何其他属性:
var foo = "foo";
console.log(Object.getOwnPropertyDescriptor(window, 'foo'));
// Object {value: "foo", writable: true, enumerable: true, configurable: false}
如果我只是分配给window.foo,或者如果我创建一个隐含的全局(但由于已知原因,[[Configurable]] 将是true,我会得到相同的输出;当然,那不会t 在严格模式下工作)。但是,如果我尝试通过分配给window.onsomething 添加事件处理程序,我无法使用Object.getOwnPropertyDescriptor 读取该属性(尽管它仍然可以在window.onsomething 下访问):
window.onresize = function onresize(e) {
console.log('rsz', e);
}
console.log(window.onresize); // function onresize(){...}
console.log(Object.getOwnPropertyDescriptor(window, 'onresize')); // undefined
浏览器如何处理这样分配的事件处理程序?我怀疑这个问题的答案也是另一个问题的答案。
【问题讨论】:
-
你真正想解决什么问题?宿主对象上的属性可能与纯 javascript 属性的行为不同(在不同的浏览器中)。
-
说实话,没有。我试图回答链接的问题,但找不到让我信服的解释。这个问题是在我研究期间提出的。
标签: javascript javascript-events event-handling