JavaScript:浏览器支持vs纯语言支持:setTimeout,setInterval

JavaScript只是一种语言,它的一个实现是V8引擎。 它用于chrome和node.js。

DOM支持不是JavaScript语言function,它是一个浏览器function(纯JS中没有DOM )。 同样的, XMLHttpRequest不是JavaScript的一部分。 这是一个JS语言的浏览器插件。

我的问题涉及菲利普·罗伯茨(Philip Roberts)的欧盟对话谈话,他指出, 其中setTimeout不在V8中 。 我想他可能是错的,但我不确定,这是我的问题。

当我打开node.js(基于V8的)控制台并键入以下内容:

 > Promise [Function: Promise] > setTimeout [Function] > setInterval [Function] > XMLHttpRequest ReferenceError: XMLHttpRequest is not defined at repl:1:1 at REPLServer.defaultEval (repl.js:262:27) at bound (domain.js:287:14) at REPLServer.runBound [as eval] (domain.js:300:12) at REPLServer.<anonymous> (repl.js:431:12) at emitOne (events.js:82:20) at REPLServer.emit (events.js:169:7) at REPLServer.Interface._onLine (readline.js:211:10) at REPLServer.Interface._line (readline.js:550:8) at REPLServer.Interface._ttyWrite (readline.js:827:14) 

我看到:

  • Promise原型在那里,因为它是ES6的一部分,在新版本的节点下已经可用。 这是JS作为一种语言的一部分
  • XMLHttpRequest不存在,因为它只在浏览器中可用,它不是该语言的一部分
  • setTimeoutsetInterval都在那里 。 菲利普·罗伯茨说,他们不是 – 但我看到它们在node.js下可用, 我认为它们应该是,因为setTimeout / setInterval在单线程/asynchronous环境中是合理的,无论它是浏览器还是服务器

我想他知道他在说什么,但我想明白为什么:)


编辑:

我看到setTimeoutwindow对象上的一个函数。 基本上, window是非标准的东西。

他是正确的,他们不是V8的一部分。 然而,它们 node.js的一部分 (通过一个默认包含的模块),并且被devise成与浏览器规范兼容:

定时器模块提供了一个全局API,用于在将来的某个时间段调用调度function。 因为定时器函数是全局的,所以不需要调用require('timers')来使用API​​。

Node.js中的定时器函数实现了与Web浏览器提供的定时器API类似的API,但是使用了围绕Node.js事件循环构build的不同的内部实现。