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

42
我想知道以下两种说法的区别是什么:
window.setTimeout(myFancyFunciton, 1000); 

并且

setTimeout(myFancyFunciton, 1000);

两者看起来做的事情完全相同,那么什么时候应该使用其中之一呢?


前者只能在浏览器中工作,而后者可以在任何地方工作。 - zerkms
除了浏览器,还有哪些地方可以工作? - user3073240
1
@user3073240 Node.js 环境 - Joe Minichino
@Joe Minichino 我不明白。。:'( - user3073240
@ user3073240 node.js 是一个服务器端 JavaScript 运行环境。您可以使用 JavaScript 编写服务器端代码(如 PHP、Java、Python 等)。请查看 此处 - Joe Minichino
显示剩余2条评论
5个回答

46
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()。它们都是同一个对象的同一个方法。

Node.js 和 window.setTimeout 实现除了返回值类型之外,还有其他区别吗? - Sasuke Uchiha

16
假设我们讨论的是基于浏览器的JavaScript: 没有区别。 setTimeout() 只是省略了 window.,这是隐含的。它们产生的效果完全相同。
这是一种编码风格和偏好的选择。
对于不在浏览器中运行的JavaScript,window 对象未定义,因此 window.setTimeout() 将失败。然而,setTimeout() 将会起作用。

4
setTimeout() 不是 ECMAScript 规范的一部分,因此它能否正常工作取决于具体的全局对象。 - Oswald

3

来自https://developer.mozilla.org/zh-CN/docs/Web/API/Window

window对象表示窗口本身。

因此,你调用的所有变量和函数都封装在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未定义。

0

0

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


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