没有窗口的窗口属性

时间:2019-08-16 18:05:42

标签: javascript

最近,我注意到在函数中使用了“ event”变量,而参数和闭包均未包含该变量。 但是它有效并且存在事件。看起来“ event”是指window.event。

因此有两个问题:

  1. 为什么我可以像访问变量一样访问窗口属性而不引用窗口?
  2. 如果我们使用普通的JavaScript(在我的情况下为TypeScript)代码,而不是在处理程序或将事件作为参数的任何事物中,则默认“ event”变量中位于哪个事件?

关于事件与窗口事件的说明: 如果直接在devTools控制台中输入“ window.innerHeight”,我们将获得该数字。同样的结果,我们只需输入“ innerHeight”而不输入“ window”即可。

1 个答案:

答案 0 :(得分:1)

  1. 为什么我可以像访问变量一样访问窗口属性而不引用窗口?

“为什么?”如果不问编写规范的人,问题是无法真正回答的。 window对象就是这样工作的,因为它代表全局范围。正如我在评论中提到的那样,无论是否带有window.前缀,您都可以访问任何全局属性。这是因为全局变量实际上是附加到全局对象的,在本例中为window -在此全局范围之外没有什么可以。同样,在没有window对象的其他JS环境中,例如,这是不正确的。在Node中,全局对象被命名为global


  1. 如果我们使用普通的JavaScript(在我的情况下为TypeScript)代码,而不是在处理程序中或将事件作为参数的任何内容中,哪个事件位于默认“事件”变量中?

您可以自己登录并查看:

console.log(window.event);

button.addEventListener('click', function (event) {
  console.log(window.event);
});
<button id="button">Click Me!</button>

根据MDN article,在处理事件的函数之外对window.event的引用是undefined。您可以从摘要中看到,第一个调用实际上是undefined,而事件监听器中的第二个则记录了正在处理的事件。