我们为什么要写窗口。

时间:2015-10-23 15:18:23

标签: javascript javascript-events

在向网页添加一些初始化代码的同时,我发现自己写了inf的时间非常短暂,当一个想法打击了我。

window.onload = ...不是必需的,因为window.是当前对象。所以它是可选的!
但没有人只写window,我想知道为什么会这样。

我的意思是,我们对编写其他内容没有疑虑,比如onload = ...没有alert限定符。

window.

实际上,window.onload = function() { alert('Your window has loaded'); }; alert一样是window对象的一种方法。
那么,为什么差异呢?为什么像W3C这样的正式网站会这样做?

4 个答案:

答案 0 :(得分:5)

我看到以下原因:

  1. 减少对范围链的搜索将提高性能轻微。这也可以在IIFE中看到,其中from selenium import webdriver phantomJSPath = "C:\my working dir\\Lib\phantomjs.exe" desiredCap = {'platform': 'ANY', 'browserName': 'phantomjs', 'version': '', 'javascriptEnabled': True} browser = webdriver.PhantomJS(executable_path=phantomJSPath, port=0, desired_capabilities=desiredCap) 作为参数发送到函数,并且在其中使用了对窗口的本地引用。
  2. 如果在window全局定义的函数/成员在范围内被覆盖,那么它将无法按预期工作,因此显式引用使其引用正确的函数/成员。这对于创建与全局函数具有相同名称的函数/成员非常有用,并且仍然可以从阴影作用域访问全局成员。

答案 1 :(得分:1)

因为.onload不是window独有的。它也可以用作document.onload。因此,您可以根据希望执行脚本的时间来定义它。

答案 2 :(得分:1)

当我们想要明确它时,我们写window.。基本上有两种情况可以使用它:

  • window对象的属性和方法 - 属于Window interface的所有内容。您提到的.onload听众就是一个例子,例如window.scrollYwindow.statuswindow.parentwindow.open()window.focus()window.removeEventListener()是其他人。
  • 创建全局属性。从任何范围分配window.myGlobalVar是创建全局"变量"的常用JS习惯用法。无可否认,使用var明确声明它仍然是更好的做法。

虽然我们可以"可选"在这里省略window.部分,它并不常见。特别是通过作业创建implicitly global variables被鄙视,通常被视为一个错误。因此,如果您是故意这样做的,请使用window.声明您的意图。

然而,第一种情况并不总是定义明确。当我们想要使用的属性本质上是一个静态的全局变量时,我们经常省略window.部分,并且即使在它上面正式指定它也不一定与window对象相关。您很少看到任何人使用documentatob()WorkersetTimeout()fetch()使用window.前缀,就像您没有使用window.JSON.parse前缀一样。 t使用window.Arraynavigator作为内置对象(虽然它有效)。

对于其他一些属性,例如locationalert()case object Mutate{ def apply( eo : IndexedSeq[Boolean] ): IndexedSeq[Boolean] = { val point = (eo.length * scala.util.Random.nextDouble).toInt eo.take( point - 1 ) ++ eo.slice( point-1,point ).map(!_) ++ eo.drop( point ) } } scala> Mutate( IndexedSeq( true, false, false, true, false, false ) ) res8: IndexedSeq[Boolean] = Vector(false, false, false, true, false, false) scala> Mutate( Vector( true, false, false, true, false, false ) ) res9: IndexedSeq[Boolean] = Vector(false, false, false, true, false, false) ,它并不总是很清楚,并且可能会使用这些属性,而不管是否为。

答案 3 :(得分:-2)

窗口对象默认由浏览器初始化。它很好 练习明确定义窗口对象它对性能的影响和你的代码将变得可以理解。