全局对象
相似的,在浏览器中有window
全局变量在一切模块中都可运用。不需要援用等。
全局变量
如console
,setTimeout
,require()
等
全局变量在一切模块中都可运用。 以下变量虽然看起来像全局变量,但实际上不是(global内里没有以下属性)。 它们的作用域只在模块内,详见 文档:
__dirname
__filename
exports
module
require()
回调函数
与js一样,如:
function callFunction(fun, name) {
fun(name);
}
callFunction(function(name) {
console.log(name + ' Bye');
}, 'mtt');
模块
一个大项目一定是分红一个个模块的,一般来说,一个文件就是一个模块。
模块运用要领:
向外暴露的是一个对象。
我们require()
的时刻,吸收的也是一个对象.
所以也能够如许写:
app.js
var stuff = require('./count');
console.log(stuff.counter(['ruby', 'nodejs', 'react']));
console.log(stuff.adder(3));//6.14
能够运用别的模块里的变量(闭包)
count.js
var adder = function(a) {
return `the sum of the 2 numbers is ${a+pi}`;
}
var pi = 3.14;
module.exports = {
counter: function(arr) {
return "There are " + arr.length + " elements in the array";
},
adder: adder
}
事宜
http://nodejs.cn/api/events.html
大多数 Node.js 中心 API 构建于习用的异步事宜驱动架构,个中某些范例的对象(又称触发器,Emitter)会触发定名事宜来挪用函数(又称监听器,Listener)。
比方,
net.Server
会在每次有新衔接时触发事宜,fs.ReadStream
会在翻开文件时触发事宜,stream
会在数据可读时触发事宜。一切能触发事宜的对象都是
EventEmitter
类的实例。 这些对象有一个eventEmitter.on()
函数,用于将一个或多个函数绑定到定名事宜上。 事宜的定名通常是驼峰式的字符串。当
EventEmitter
对象触发一个事宜时,一切绑定在该事宜上的函数都邑被同步地挪用。
例子,一个简朴的 EventEmitter
实例,绑定了一个监听器。 eventEmitter.on()
用于注册监听器,eventEmitter.emit()
用于触发事宜。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('触发事宜');
});
myEmitter.emit('event');
总结明白:
- 触发器(Emitter)会触发监听器(Listener),然后函数会被同步挪用。
- myEmitter.on(‘event’, () => {});用来 绑定事宜与函数(注册监听器,
eventEmitter.emit()
用于触发事宜 - 例子:
net.Server
会在每次有新衔接时触发事宜,fs.ReadStream
会在翻开文件时触发事宜,stream
会在数据可读时触发事宜。
传参数与 this
到监听器
http://nodejs.cn/api/events.h…
eventEmitter.emit() 要领能够传恣意数目的参数到监听器函数。 当监听器函数被挪用时,this 关键词会被指向监听器所绑定的EventEmitter 实例。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter{}
const myEmitter1 = new MyEmitter();
myEmitter1.on('exxx',function (a, b) {
console.log(a, b, this, this===myEmitter1);
})
myEmitter1.emit('exxx','我是a','我是b')
总结:
-
eventEmitter.emit()
从第二个参数最先,会把参数传到监听器绑定的谁人函数内里,作为第一个最先. -
this
代表挪用on
的谁人实例
事宜只处置惩罚一次
当运用 eventEmitter.on()
注册监听器时,监听器会在每次触发定名事宜时被挪用。
const myEmitter = new MyEmitter();
let m = 0;
myEmitter.on('event', () => {
console.log(++m);
});
myEmitter.emit('event');
// 打印: 1
myEmitter.emit('event');
// 打印: 2
运用 eventEmitter.once()
能够注册最多可挪用一次的监听器。 当事宜被触发时,监听器会被注销,然后再挪用。
const myEmitter = new MyEmitter();
let m = 0;
myEmitter.once('event', () => {
console.log(++m);
});
myEmitter.emit('event');
// 打印: 1
myEmitter.emit('event');
// 不触发
evnets是中心库,直接require('events')
手动用代码触发事宜。
util(实用东西)(nodejs中心东西库)
http://nodejs.cn/api/util.htm…
var events = require('events');
var util = require('util');//nodejs东西库
var Person = function(name) {
this.name = name
}
util.inherits(Person, events.EventEmitter);
//让Person继续events.EventEmitter(也能够用ES6写法的extends关键字),让他具有能够绑定事宜,触发事宜的功用。
var xiaoming = new Person('xiaoming');
var lili = new Person('lili');
var lucy = new Person('lucy');
//新天生三个对象
var person = [xiaoming, lili, lucy];
person.forEach(function(person) {
person.on('speak', function(message) {
console.log(person.name + " said: " + message);//给每个新对象绑定事宜
})
})
xiaoming.emit('speak', 'hi');//每个新对象都能够触发事宜
lucy.emit('speak', 'I want a curry');
读写文件(同步,异步)
文件体系:http://nodejs.cn/api/fs.html
fs 模块用于以一种相似规范 POSIX 函数的体式格局与文件体系举行交互。
运用要领以下:
const fs = require(‘fs’);
一切的文件体系操纵都有同步和异步两种情势。
异步
异步情势的末了一个参数是完成时的回调函数。 传给回调函数的参数取决于具体要领,但第一个参数会保留给非常。 假如操纵胜利完成,则第一个参数(非常)会是 null
或 undefined
。
const fs = require('fs');
fs.unlink('/tmp/hello', (err) => {
if (err) throw err;
console.log('胜利删除 /tmp/hello');
});
同步
当运用同步操纵时,任何非常都邑马上抛出,能够运用 try/catch
处置惩罚非常。
const fs = require('fs');
try {
fs.unlinkSync('/tmp/hello');
console.log('胜利删除 /tmp/hello');
} catch (err) {
// 处置惩罚非常。
}
同步异步注重
异步的要领不能保证实行递次。 所以下面的例子可能会失足,由于 fs.stat()
可能在 fs.rename()
之前完成:
fs.rename('/tmp/hello', '/tmp/world', (err) => {
if (err) throw err;
console.log('重定名完成');
});
fs.stat('/tmp/world', (err, stats) => {
if (err) throw err;
console.log(`文件属性: ${JSON.stringify(stats)}`);
});
要想按递次实行操纵,需要把 fs.stat() 放到 fs.rename() 的回调函数中:
fs.rename('/tmp/hello', '/tmp/world', (err) => {
if (err) throw err;
fs.stat('/tmp/world', (err, stats) => {
if (err) throw err;
console.log(`文件属性: ${JSON.stringify(stats)}`);
});
});