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

时间:2016-07-22 14:54:15

标签: javascript node.js settimeout v8

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不存在,因为它仅在浏览器中可用,但它不是语言的一部分
  • setTimeoutsetInterval都在那里。 Philip Roberts表示他们不是 - 但我认为它们在node.js和下可用,我认为它们应该是,因为setTimeout / setInterval在单线程/异步环境中有意义,无论如何如果它是浏览器或服务器

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

编辑:

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

1 个答案:

答案 0 :(得分:4)

他是对的,因为他们不属于V8。然而,他们 part of node.js(通过默认包含的模块),并且设计的方式与浏览器规范兼容:

  

计时器模块公开了一个全局API,用于调度将来某个时间调用的函数。因为计时器函数是全局变量,所以不需要调用require('timers')来使用API​​。

     

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