window.setTimeout()和setTimeout()之间有什么区别?

时间:2013-12-06 09:32:42

标签: javascript settimeout

我想知道

之间的区别
window.setTimeout(myFancyFunciton, 1000); 

setTimeout(myFancyFunciton, 1000);

两者似乎完全一样。你何时应该使用其中一种?

5 个答案:

答案 0 :(得分:28)

JavaScript在由全局对象定义的环境中运行。可以在不明确引用对象的情况下调用全局对象的方法(即没有obj.function()表示法)。

在浏览器中运行JavaScript时,全局对象由文档对象模型(DOM)提供。 DOM的全局对象具有方法setTimeout()。这就是你可以致电setTimeout()

的原因

DOM指定全局对象具有名为window的属性,该属性是对全局对象的引用。这就是为什么你可以拨打window.setTimeout()和(通过传递性)window.window.setTimeout()window.window.window.setTimeout()和(你猜对了)window.window.window.window.window.window.window.window.window.setTimeout()。这是同一个对象的所有方法。

答案 1 :(得分:8)

假设我们在谈论基于浏览器的JavaScript:没有区别。 setTimeout()只是省略window.隐含。它们的效果完全相同。

这是编码风格和偏好的选择。

对于未在浏览器中运行的JavaScript,未定义window对象,因此window.setTimeout()将失败。然而,setTimeout()会起作用。

答案 2 :(得分:2)

来自https://developer.mozilla.org/en-US/docs/Web/API/Window

  

窗口对象代表窗口本身。

因此,您调用的所有变量和函数都包含在对象窗口中。但是,每次调用函数或变量时都可以省略对象引用。

为什么这样? 考虑一个包含2个或更多帧的页面。每个框架都有自己的window。您可以从另一个框架访问框架内的变量,只需访问目标的window对象即可。 这对于声明为全局的每个变量或函数都有效...对于本机函数也是有效的,例如setTimeout

那么为什么有时我们需要写明显window.setTimeout

简单地说,如果您在作用域内并使用相同的本机函数名称,则可以选择要使用的函数。

例如:

function myF() {
  function setTimeout(callback,seconds) {
    // call the native setTimeout function
    return window.setTimeout(callback,seconds*1000); 
  }
  // call your own setTimeout function (with seconds instead of milliseconds)
  setTimeout(function() {console.log("hi"); },3);

}
myF();

请注意,对象window仅存在于浏览器环境中。 Node.js的全局对象为global,其中window未定义。

答案 3 :(得分:1)

完全一样。如果不指定窗口,则隐式窗口。查看可能的副本:

Is there a need to prepend setTimeout and setInterval with window object?

答案 4 :(得分:0)

我遇到了与此主题相关的问题。我试图让我的SPA的一些功能成为服务器端渲染过程的一部分。我使用setTimeout在UI上提供了一些延迟操作。当它在服务器端(NodeJS)上工作时,它将变为服务器端的延迟操作,与客户端无关。这是因为浏览器setTimeout(比如window.setTimeout)与NodeJS setTimeout不同。除了禁止使用单个setTimeout进行客户端和服务器端呈现的不同运行时环境之外,BrowserNodeJs setTimeout的实现不同,它们有所不同返回值...现在我正在寻找一些解决方法。