我想知道
之间的区别window.setTimeout(myFancyFunciton, 1000);
和
setTimeout(myFancyFunciton, 1000);
两者似乎完全一样。你何时应该使用其中一种?
答案 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)