Node中的JavaScript

2023-05-16

Node中的JavaScript

global对象

  1. 在浏览器中,全局对象指的就是window对象;
  2. Node中有两个类似却各自代表着不同含义的对象:global和process;
  3. 任何global对象上的属性都可以被全局访问到;
  4. 所有全局执行上下文中的内容都在process对象中。在浏览器中,只有一个window对象,在Node中,也只有一个process对象;

模块系统

  1. Javascript语言标准中并未为模块以来以及模块独立定义专门的API。通过直接引入多个模块的方式,会导致多个模块对全局命名控件的污染及命名冲突的问题。
  2. Node中引入了一个强大的模块系统,该模块系统有三个核心的全局对象:require、module和exports。(其实遵循的就是CommonJS的规范)

绝对和相对模块

  1. 绝对模块是指Node通过在其内部node_modules查找到的模块,或者Node内置的如fs这样的模块;
  2. 不一定非要将应用中的每一部分都作为一个单独的模块和各自单独的package.json文件,可以使用相对模块;
  3. 那么什么是相对模块呢?相对模块是将require指向了一个相对工作目录中的JavaScript文件。如:
    module_a.js
console.log('Module A');

module_b.js

console.log('Module B');

main.js

require('./module_a');
require('./module_b');

运行结果可想而知咯。
注意:在main.js中如果是这样 require(‘module_a’);的话就会报错。原因在于它们并没有通过NPM安装,也不在node_modules目录中,而且Node自带模块中没有以此为名的模块。

暴露API

  1. 要让模块暴露一个API成为require调用的返回值,就要依靠module和exports这两个全局变量。其中exports就是对module.exports的引用(既然是对module.exports的引用,那么exports与module.exports当然有所不同。实际上暴露的是module.exports对象,而exports变量不过是指向了module.exports的实际内容,即exports可以添加属性,但是exports变量如果为重新赋值,那么将毫无意义,exports已经指向了其他地方。);
  2. 需要暴露API给外部,可以通过向全局变量exports对象添加属性,如:
    module_a.js
exports.name = 'DreamBoy';
exports.age = 18;
exports.show = function() {
    console.log('It is funny.');
};

main.js

var a = require('./module_a.js');
console.log(a.name);
console.log(a.age);
console.log(a.show());

当然在exports对象上逐个添加属性的方式无法满足需求时,也可以采用彻底重写module.exports的方式。如:
person.js

module.exports = Person;
function Person(name) {
    this.name = name;
}
Person.prototype.talk = function() {
    console.log('My name is ' + this.name);
};

那么在引用该模块的模块中,将获得一个Person对象(函数也是对象,难道不是吗?)。如:
index.js

var Person = require('./person.js');
var boy = new Person('DreamBoy');
boy.talk();

事件

*1. 在Node中,暴露了Event EmitterAPI,实现事件的监听和分发。该API上定义了on、emit以及removeListener方法。它以process.EventEmitter形式暴露出来。如:
index.js

var EventEmitter = require('events').EventEmitter, a = new EventEmitter();
a.on('event', function() {
    console.log('event called');
}); // 绑定事件
a.emit('event'); // 触发事件

*2. 也可以很容易地将EventEmitter添加到自己的类中。如:

var EventEmitter = process.EventEmitter, MyClass = function() {};
MyClass.prototype.__proto__ = EventEmitter.prototype;

这样,所有MyClass的实例都具备了事件功能:

var a = new MyClass;
a.on('事件名', function() {
    // 执行某一事件被触发后的操作
});

*3. 事件时Node非阻塞设计的重要体现。Node通常不会直接返回数据(因为这样 可能会在等待某个资源的时候发生线程阻塞),而是采用分发事件来传递数据的方式;
*4. 不管某个事件在将来会被触发多少次,我们都希望只调用一次回调函数。Node为这类需求提供了一个名字简洁的方法:

a.once('事件名', function() {
    // 执行某一事件被触发后的操作
});

buffer

  1. buffer是一个表示固定内存分配的全局对象;
  2. 在Node.js中,绝大部分进行数据IO操作的API都用buffer来接收和返回数据。如:
var mybuffer = new Buffer('==ii1j2i3h1i23h', 'base64');
console.log(mybuffer);
require('fs').writeFile('logo.png', mybuffer);

运行代码:

$ node index
$ open logo.png

上述脚本中,从用base64表示的buffer中创建图片,显示了Node.js的logo。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node中的JavaScript 的相关文章

随机推荐

  • Python爬虫实战:抓取并保存百度云资源(附代码)

    專 欄 王雨城 xff0c Python中文社区专栏作者 博客 xff1a http www jianshu com u 88ff70818bd1 寻找并分析百度云的转存api 首先你得有一个百度云盘的账号 xff0c 然后登录 xff0c
  • Android 系统禁止应用的某个弹框

    需求 xff1a 谷歌拼音输入法首次使用会弹出以下提示 xff0c 为了提高用户体验 xff0c 在系统层屏蔽此弹窗 这里以谷歌输入法首次使用为例 分析 xff1a 系统dialog的弹出都是集成Dialog java 所以我们先找到dia
  • mysql中的null值和空值区别

    转载自 xff1a 点击打开链接 标签 xff1a 笔记 mysql null 发表时间 xff1a 2014 06 06 23 46 作者 xff1a 出处 xff1a http jackyrong iteye com mysql中的nu
  • bootstrap-table的入门使用——从服务器获取数据

    参考 xff1a Bootstrap Table 查询 xff08 服务器端 xff09 刷新数据 这里需要使用 bootstrap table 插件 使用了CSS3loader显示加载过程 效果如下 xff1a index html lt
  • MySql中UTF8 和 GBK 编码中文字符长度问题

    转载自 xff1a MySql中UTF8 和 GBK 编码中文字符长度问题 MySql中UTF8 和 GBK 编码中文字符长度问题 出处 xff1a http blog csdn net 为什么要了解MySql中UTF8 和 GBK 编码中
  • PHP对表单提交特殊字符的过滤和处理

    转载自 xff1a PHP对表单提交特殊字符的过滤和处理 函数名 释义 介绍htmlspecialchars将与 单双引号 大于和小于号化成HTML格式 amp 转成 amp amp 34 转成 amp quot 39 转成 amp 039
  • ThinkPHP中数据库操作返回值总结

    转载自 xff1a ThinkPHP中数据库操作返回值总结 关键字 xff1a Thinkphp 返回值 数据库操作 select返回值 add返回值 setDec返回值 Thinkphp中的Think Model类提供了数据库的基本CUR
  • 基于 Token 的身份验证

    转载自 xff1a 基于 Token 的身份验证 最近了解下基于 Token 的身份验证 xff0c 跟大伙分享下 很多大型网站也都在用 xff0c 比如 Facebook xff0c Twitter xff0c Google 43 xff
  • 打造 Bootstrap Tags Input 同 Modal 结合的利器

    Boostrap Tags input 的使用 xff1a http bootstrap tagsinput github io bootstrap tagsinput examples Boostrap Tags Input 插件基于Bo
  • 打造 Bootstrap Tags Input 同 Modal 结合的利器(改)

    对上文 打造 Bootstrap Tags Input 同 Modal 结合的利器 中的 js 进行整合 xff0c 如下 xff1a bootstrap tagsinput demo js Created by DreamBoy on 2
  • 我的简单PHP框架——LabPHP v1.0.1

    此前讲到 我做的一个基于MVC设计思想的简单PHP框架 xff08 我的简单PHP框架 LabPHP xff09 xff0c 这里对其进行一些改进 xff0c 改进地方如下 xff1a 1 对 LabPHP Common functions
  • 关于ThinkPHP中URL及模板文件名大小写的讨论

    参考 xff1a ThinkPHP3 2 3完全开发手册 URL模式 thinkphp中处理url大小写敏感的技术方案 TP模板因路径大小写获取不到的Bug 特别地 xff0c 需要注意的是 xff1a 调试模式下URL区分大小写 xff1
  • 【免费送书】说说哪本书曾经让你爱不释手

    编程狗在线 自由的编程学习平台 一本好书带给人的不止于知识收获 xff0c 还会对你的成长有所帮助 xff0c 与你的每次经历产生共鸣 每天读一点 xff0c 坚持不懈 xff0c 你就能成为专业高手 如果你能每两个月读一本好的编程书 xf
  • PHP中的cURL函数

    今天看了一个接口的使用 xff0c 其中接口的示例中使用到PHP的cURL函数 xff0c 那么有趣的事情就来了 使用PHP向某个URL发送数据并接收响应数据 xff1a function request data url data 61
  • 设计模式之适配器(Adapter)模式

    转载自 xff1a 设计模式学习笔记 适配器 Adapter 模式 参考 xff1a Java设计模式之Adapter模式 2 自己阅读了原文中的例子颇有受益 xff0c 在此前常听到Java中adapter适配器一词 xff08 虽说现在
  • Java软件体系结构设计模式之结构模式 知识点摘录

    以下知识点摘录自 xff1a Java软件体系结构设计模式标准指南 一书 其中可能包含本人的一些感悟 Java软件体系结构设计模式之结构模式 xff08 11种 xff09 结构模式主要用来 xff1a 1 xff09 处理把责任委托给其他
  • 支付宝在线支付接口开发教程与总结

    转载自 xff1a 支付宝在线支付接口开发教程与总结 1 什么是第三方支付 所谓第三方支付 xff0c 就是一些和各大银行签约 并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台 在通过第三方支付平台的交易中 xff0c 买方选购商
  • Android 应用商店评分+APP分享

    转载自 xff1a Android Market链接的生成 调用Market 搜索软件 Android 调用已安装市场 xff0c 进行软件评分的功能实现 参考 xff1a Android跳转到应用商店的APP详情页面 xff0c 以及 G
  • 用一个二维码做下载地址,自动区分是 ios 还是 android

    转载自 xff1a 用一个二维码做下载地址 xff0c 自动区分是 ios 还是 android 更多参考 xff1a 好推二维码如何通过应用宝微下载支持微信自动打开APP下载 xff1f 用一个二维码做下载地址 xff0c 自动区分是 i
  • Node中的JavaScript

    Node中的JavaScript global对象 在浏览器中 xff0c 全局对象指的就是window对象 xff1b Node中有两个类似却各自代表着不同含义的对象 xff1a global和process xff1b 任何global