2016-07-22 74 views
1

JavaScript是只是一个语言和它的实现方式之一是V8引擎。它用于chrome以及node.js。的JavaScript:浏览器支持与纯语言支持:的setTimeout,setInterval的

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的一部分,在新版本的节点下已经可用。它是作为一种语言
  • XMLHttpRequestJS的一部分是不存在的,因为它只是在浏览器中可用,这不是语言
  • setTimeoutsetInterval的一部分,在那里。菲利普·罗伯茨说,他们是不会 - 但我看到他们下的node.js和我想他们应该是可用的,因为在单线程/异步环境setTimeout/setInterval意义,不管它是一个浏览器或服务器

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


编辑:

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

回答

4

他是正确的,因为它们不是V8的一部分。他们然而,part of node.js(由模块,包括默认的方式),并在某种程度上,他们是与浏览器规范兼容的设计:

定时器模块暴露调度一个全球性的API函数将在未来的某个时间被调用。由于计时器功能是全局,没有必要打电话要求(“定时器”)使用的API。

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