前端知识库(lizh)
  • README
  • Bugs
    • 前端调试随笔
    • 浏览器常见问题概览
    • 浏览器兼容问题概览
    • HTML常见问题概览
    • CSS常见问题概览
    • JS常见问题概览
    • 移动端兼容性问题概览
    • 微信小程序开发
    • NodeJs常见问题概览
    • Mac常见问题概览
    • 微信开发遇坑指南
    • Npm包常见问题概览
    • 其他问题汇总
  • Css探索系列
    • CSS基础知识
    • CSS常见问答
    • CSS常见问答02
    • CSS应用示例
    • CSS应用示例02
    • 由Z Index引发的层叠上下文思考
    • 由浮动塌陷引发的块级格式上下文思考
    • CSS探索系列 Flex布局
    • CSS探索系列 Margin
    • CSS探索系列 Auto关键字
    • CSS探索系列 Gradient
    • CSS探索系列 Line Height
    • CSS探索系列 元素居中
    • CSS探索系列 动画
    • 为什么使用PostCSS处理CSS?
    • 重新认识伪类与伪元素
    • 自定义表单伪元素样式
    • 如何理解Css中的Display属性
    • 视口和软键盘对视口的影响
    • 关于Css
  • Frontend
    • 00 关于Web前端
    • 01 前端知识概览
    • 02 常用前端库概览
    • 基础 00 前端常见问题01
    • 基础 01 浏览器缓存
    • 基础 02 浏览器工作原理
    • 基础 03 谈谈前端跨源问题及解决方法
    • 进阶 01 Web性能优化
    • 进阶 02 搜索引擎优化(SEO)
    • 进阶 03 前端模块化编程
    • 进阶 04 规范代码:Linter、Prettier、EditorConfig
    • 进阶 11 前端自动化测试
    • 高级 01 前端安全
    • Vue2.X原理篇
    • Vue3初步了解及迁移指南
    • 重读Vue教程
    • React17.X原理篇
    • 你必须知道的React问题
    • 重读React教程
    • 聊一聊Cookie的一些问题
    • 如何理解HTTP响应的状态码
    • HTTP的历史演变及概述
    • Webpack4.X原理篇
    • Webpack基础入门篇
    • Webpack构建优化篇
    • TypeScript使用指南
    • 代码规范
      • 前端规范
      • HTML
      • CSS
      • JS
  • Html探索系列
    • HTML基础知识
    • HTML基础知识02
    • HTML常见问答
    • HTML经典实践用例
    • HTML元素的宽高及位置详解
    • Video元素的使用和常见问题总结
    • Html探索系列 Meta标签
    • DOCTYPE:文档类型与浏览器模式
    • DHTML(动态网页)简介
    • HTML标签详解
    • HTML布局的几种方式
    • HTML全局属性
    • 关于Html
  • Js探索系列
    • 基础知识
    • 常见问答
    • 应用示例
    • 趣味示例
    • 基础篇 05 AJAX
    • 基础篇 06 Window对象
    • 基础篇 07 Error、JSON、Math、Console对象
    • 基础篇 08 History、URL、Screen、Navigator、Location对象
    • 基础篇 09 文档对象模型(DOM)
    • 基础篇 10 Document对象
    • 基础篇 11 Element对象
    • 基础篇 12 Event对象
    • 基础篇 13 键盘、鼠标、触摸事件
    • 基础篇 15 CSS对象模型(CSSOM)
    • 进阶篇 01 Prototype对象和继承
    • 进阶篇 02 Promise对象
    • 进阶篇 07 迭代器(Iterator)
    • 进阶篇 08 Generator和Async函数
    • 进阶篇 09 JavaScript异步编程
    • Date对象和日期时间字符串格式
    • Canvas基础入门篇
    • Canvas进阶篇
    • SVG基础入门篇
    • 四种判断数据类型方法的优缺点
    • 深入理解JavaScript的浅拷贝和深拷贝
    • 谈谈JavaScript的作用域和上下文
    • 复制内容到剪贴板
    • 关于Javascript
  • NodeJs
    • 关于Node.Js
    • Node.Js:三种调试方法
    • Npm包管理器简介及一些机制
    • NPM:Package.Json详解(中文)
    • NPM:从零开始,开发一个软件包
    • NPM:常用命令
    • Node.Js:Fs(文件系统)
    • Node.Js:Global(全局变量)
    • Node.Js:HTTP
    • Node.Js:Module(模块)
    • Node.Js:Path(路径)
    • Node.Js:Readline(逐行读取)
  • Research
    • 极细边框(1px边框)实现方式
    • 如何监控前端异常?
    • H5页面跳转和刷新
    • Web主题切换和个性化定制方法总结
    • Vue SSR(服务端渲染)的简单实现
    • 基于Create React App打造代码规范化的React+Ts项目
    • H5可视化编辑
    • Web常用功能
    • Javascript加密混淆
    • Vue如何导入TypeScript
    • 移动端PDF预览
    • 纯CSS绘制箭头
    • 网站性能测量和优化方法
  • Tech
    • GOOGLE浏览器的搜索技巧
    • Curl的用法指南
    • Sublime3插件篇
    • Charles安装及使用
    • Nginx基础使用
    • 排序算法(Javascript)
    • 代码整洁之道(摘录笔记)
    • Java的24种设计模式与7大原则
    • 观察者和发布订阅模式
  • Tools
    • Git
      • Git基础教程
      • Git常见问题
    • Gitbook
      • Gitbook入门篇
      • Gitbook插件篇
      • Gitbook进阶篇
由 GitBook 提供支持
在本页
  • 全局变量
  • Buffer 类
  • Console 类
  • exports
  • global
  • module
  • process
  • require()
  • __dirname
  • __filename
  • setImmediate(callback[, ...args])
  • clearImmediate(immediate)
  • setInterval(callback, delay[, ...args])
  • clearInterval(timeout)
  • setTimeout(callback, delay[, ...args])
  • clearTimeout(timeout)
  • 参考资料

这有帮助吗?

  1. NodeJs

Node.Js:Global(全局变量)

上一页Node.Js:Fs(文件系统)下一页Node.Js:HTTP

最后更新于1年前

这有帮助吗?

全局变量在所有的模块中都可用。 本文列出的对象特定于 Node.js,有些内置对象是 JavaScript 语言本身的一部分,它们也是全局可访问的。

有些变量虽然看似全局的,但实际上不是,它们仅存在于模块的作用域中:

  • __dirname

  • __filename

  • exports

  • module

  • require()

全局变量

用于直接处理二进制数据。

  • Buffer.alloc(size[, fill[, encoding]])

  • Buffer.allocUnsafe(size)

  • Buffer.allocUnsafeSlow(size)

  • Buffer.byteLength(string[, encoding])

  • Buffer.compare(buf1, buf2)

  • Buffer.concat(list[, totalLength])

  • Buffer.from(array)

  • Buffer.from(arrayBuffer[, byteOffset[, length]])

  • Buffer.from(buffer)

  • Buffer.from(object[, offsetOrEncoding[, length]])

  • Buffer.from(string[, encoding])

  • Buffer.isBuffer(obj)

  • Buffer.isEncoding(encoding)

  • Buffer.poolSize

  • ...

Console 类

console 模块提供了一个简单的调试控制台,类似于 Web 浏览器提供的 JavaScript 控制台。

该模块导出了两个特定的组件:

  • 一个 Console 类,包含 console.log() 、 console.error() 和 console.warn() 等方法,可以被用于写入到任何 Node.js 流。

  • 一个全局的 console 实例,可被用于写入到 process.stdout 和 process.stderr。 注意:全局的 console 对象的方法既不总是同步的(如浏览器中类似的 API),也不总是异步的(如其他 Node.js 流)。

Console 类可用于创建一个具有可配置的输出流的简单记录器:

const { Console } = require('console');
// 或者
const { Console } = console;
  • new Console(stdout[, stderr])

  • console.assert(value[, message][, ...args])

  • console.clear()

  • console.count([label])

  • console.countReset([label='default'])

  • console.debug(data[, ...args])

  • console.dir(obj[, options])

  • console.error([data][, ...args])

  • console.group([...label])

  • console.groupCollapsed()

  • console.groupEnd()

  • console.info([data][, ...args])

  • console.log([data][, ...args])

  • console.time(label)

  • console.timeEnd(label)

  • console.trace([message][, ...args])

  • console.warn([data][, ...args])

exports

exports 变量是在模块的文件级别作用域内有效的,它在模块被执行前被赋予 module.exports 的值。

它有一个快捷方式,以便 module.exports.f = ... 可以被更简洁地写成 exports.f = ...。

注意: 就像任何变量,如果一个新的值被赋值给 exports,它就不再绑定到 module.exports。

module.exports.hello = true; // 从对模块的引用中导出
exports = { hello: false };  // 不导出,只在模块内有效

当 module.exports 属性被一个新的对象完全替代时,也会重新赋值 exports,例如:

module.exports = exports = function Constructor() {
  // ... 及其他
};

global

全局的命名空间对象。

在浏览器中,顶层作用域就是全局作用域。 这意味着在浏览器中,var something 会定义一个新的全局变量。 在 Node.js 中则不同,顶层作用域不是全局作用域,var something 的作用域只在模块内。

module

在 Node.js 模块系统中,每个文件都被视为独立的模块。

在每个模块中,module 的自由变量是一个指向表示当前模块的对象的引用。 为了方便,module.exports 也可以通过全局模块的 exports 对象访问。 module 实际上不是全局的,而是每个模块本地的。

process

process 对象是一个全局变量,它提供当前 Node.js 进程的有关信息,以及控制当前 Node.js 进程。 因为是全局变量,所以无需使用 require()。

require()

引入模块。

__dirname

当前模块的目录名。

注意: __dirname 变量虽然看似全局的,但实际上不是。

console.log(__dirname) // '/Users/xxx/Documents/xxx/demo-lizh/node/nodejs'

__filename

当前模块的文件名,返回当前模块文件的绝对路径(符号链接会被解析)。

注意: __filename 变量虽然看似全局的,但实际上不是。

console.log(__filename) // '/Users/xxx/Documents/xxx/demo-lizh/node/nodejs/global.js'

注意: 对于主程序,这不一定与命令行中使用的文件名相同。

也就是说,运行 node main.js,main.js 导入 a.js 文件,a.js 文件中 console.log(__filename) 语句打印的是 a.js 文件的绝对路径,而不是 main.js 文件的绝对路径。

setImmediate(callback[, ...args])

setImmediate 参数中的回调函数是在事件循环的下一个迭代中执行。

当多次调用 setImmediate() 时, callback 函数会按它们被创建的顺序放入排队等待执行。 每轮的事件循环迭代都会处理整个回调队列。 如果一个 immediate 定时器是从一个正在执行中的回调内部被放入队列,则该定时器将不会被触发,直到下一轮的事件循环迭代。

注意: 延迟 0 毫秒的 setTimeout() 回调与 setImmediate() 非常相似。它们的执行顺序取决于各种因素,但是都会在事件循环的下一个迭代中运行。

零延迟 setTimeout() 和 setImmediate() 的执行顺序:

  • 在文件 I/O、网络 I/O 等异步任务中,setImmediate() 会先于 setTimeout(fn,0)。(注意:这里仅指 Node.js 中,浏览器的事件循环机制是不一样的)。

    const fs = require('fs')
    fs.readFile(__filename, () => {
        setTimeout(() => {
            console.log('1')
        }, 0)
        setImmediate(() => {
            console.log('2')
        })
    })
    // 2
    // 1
  • 其他情况下,一般来说,取决于同步代码执行时间:代码执行时间较长(Node.js 中,一般是指超过 1ms,因为,Node.js 会将 setTimeout(fn, 0) 强制改为setTimeout(fn, 1)),则 setTimeout(fn,0) 先执行;否则 setImmediate() 先执行。

    setTimeout(() => {
      console.log('1')
    }, 0)
    setImmediate(() => {
      console.log('2')
    })
    // 顺序不确定

clearImmediate(immediate)

取消由 setImmediate() 创建的 Immediate 对象。

setInterval(callback, delay[, ...args])

每隔 delay 毫秒重复执行 callback。

当 delay 大于 2147483647 或小于 1 时,则 delay 将会被设置为 1。 非整数的 delay 会被截断为整数。

clearInterval(timeout)

取消由 setInterval() 创建的 Timeout 对象。

setTimeout(callback, delay[, ...args])

在 delay 毫秒之后执行一次性的 callback。

callback 可能不会精确地在 delay 毫秒后被调用 。 Node.js 不保证回调被触发的确切时间,也不保证它们的顺序。 回调会在尽可能接近指定的时间被调用。

当 delay 大于 2147483647 或小于 1 时,则 delay 将会被设置为 1。 非整数的 delay 会被截断为整数。

clearTimeout(timeout)

取消由 setTimeout() 创建的 Timeout 对象。

注意: 在Node.js 中,setImmediate()、setInterval() 和 setTimeout() 方法会各自返回表示安排的定时器的对象;而在浏览器中,它们的返回值是一个正整数,表示定时器的编号。

参考资料

Buffer 类
API Reference Document - global(全局变量)
setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop