JavaScript只是一种语言,其实现之一是V8
引擎。它用于chrome以及node.js。
DOM
支持不是JavaScript语言功能,它是一个浏览器功能(纯JS中没有DOM
)。同样,XMLHttpRequest
不是JavaScript的一部分。它是JS语言的浏览器插件。
我的问题与Philip Roberts' JS conf EU谈话有关,他说,其中,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
不存在,因为它仅在浏览器中可用,但它不是语言的一部分setTimeout
和setInterval
都在那里。 Philip Roberts表示他们不是 - 但我认为它们在node.js和下可用,我认为它们应该是,因为setTimeout
/ setInterval
在单线程/异步环境中有意义,无论如何如果它是浏览器或服务器。我猜他知道他在说什么,但我想明白为什么:)
编辑:
我看到setTimeout
是window
对象上的函数。基本上,window
是非标准的东西。
答案 0 :(得分:4)
他是对的,因为他们不属于V8。然而,他们 ,part of node.js(通过默认包含的模块),并且设计的方式与浏览器规范兼容:
计时器模块公开了一个全局API,用于调度将来某个时间调用的函数。因为计时器函数是全局变量,所以不需要调用require('timers')来使用API。
Node.js中的计时器函数实现了与Web浏览器提供的计时器API类似的API,但使用了围绕Node.js事件循环构建的不同内部实现。