【问题标题】:JavaScript: browsers support vs pure language support: setTimeout, setIntervalJavaScript:浏览器支持 vs 纯语言支持:setTimeout、setInterval
【发布时间】:2016-07-22 14:54:15
【问题描述】:

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 是非标准的东西。

【问题讨论】:

    标签: javascript node.js settimeout v8


    【解决方案1】:

    他说得对,他们不是 V8 的一部分。然而,它们part of node.js(通过一个模块,默认包含),并且它们的设计方式与浏览器规范兼容:

    计时器模块公开了一个全局 API,用于安排在未来某个时间段调用的函数。因为定时器函数是全局函数,所以不需要调用 require('timers') 来使用 API。

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

    【讨论】:

      猜你喜欢
      • 2011-02-20
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 2012-04-10
      • 2019-07-30
      • 2012-02-14
      • 2010-11-24
      相关资源
      最近更新 更多