何时以及何时不需要在窗口属性和方法中指定 "window." 前缀

8

一些属性和方法通常带有前缀window.,而另一些则没有。

例如,documentsetTimeout()几乎从不与window.一起使用。另一方面,window.locationwindow.open()经常与前缀一起使用。

我知道它们本质上指的是同一件事情,并且如果没有window. ,名称可能会被内部作用域中相同名称的内容所隐藏。我不是在询问语法上的区别,而是这种约定的原因。由于这种一致性,我认为一定有原因,我想知道为什么。

成员几乎总是不带前缀找到:

  • document
  • console
  • setTimeout()
  • alert()
  • fetch()

带前缀的:

  • window.location
  • window.onload
  • window.open()

我的猜测是,locationonloadopen过于通用,不能单独使用。将它们附加到其他内容上会使您的代码更易读。然而,在setTimeout等情况下,如果将它们附加到window上,则不会增加任何好处。 - Ahmad
1
大多数问题都可以归咎于旧的w3schools文档,但出于某种原因,最新的成员window.URL也总是如此,这是JS传统中冗余的window.家族的一部分。这让我疯了好几年;我嘲笑地问:“为什么不使用window.window.URL?” - dandavis
1个回答

3

这是一个涉及 JavaScript 作用域的问题。

作用域如下:


----------foo------------
|       var location    |
|                       | 
|     ------bar---------------
|     |   window.location    |
|     |                      |
|     |           -------baz----------
|     |           |  location = ''   |
|     |           |                  |
|     |           --------------------
|     |-----------------------|
|------------------------|

foo、bar和baz都是函数(或对于constlet,它们是块),所以如果我想要访问全局(例如window)的属性或方法,我需要使用window.xxx,否则可能会引用用户定义的变量,例如在foo函数中定义的location

对于这些成员:

几乎总是不带前缀找到的成员:

document
console
setTimeout()
alert()
fetch()

原因:

  1. 我们将它们视为函数或常量(document
  2. 我们不会改变任何东西,只是调用一个函数或读取一些东西。

带有前缀:

window.location
window.onload
window.open()

因为:

  1. 我们会改变某些东西。
  2. 我们将它们视为对象属性。
  3. 更加描述性,比较window.openopen打开什么?窗口!!代码就是这样说的。

另一个原因

当前作用域可能会给您提供在window中定义的自定义方法,也称为shadowing,您可能想要使用该方法。

function foo () {
  function alert (sth) {
    console.log(`alert:${sth}`)
    window.alert(sth)
  }
  alert('I am Carebear.')
}

foo()

想象一下,一个库或你的朋友定义了一个自定义的alert,它与window.alert完全兼容。调用alert时不需要window也可以使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接