process进程
- 除了process.env环境变量,可以通过增加process.env,NODE_ENV区分环境,process还提供了一些其他的属性方法。
//process.nextTick,异步的,在当前队列的底部执行。
process.nextTick(function(){
console.log('nextTick')
})
//global上提供了setImmediate setTimeout,global的属性可以直接使用
//setImmediate,异步的,在第二队列的顶部
setImmediate(functions(){
console.log('setImmediate')
})
//setTimeout,异步,也是第二队列,如果不定时间,则与setImmediate不相上下。如果写了时间,则setimmediate更快些。
setTimeout(function(){
console.log('setTimeout')
})
复制代码
- nextTick setImmedate setTimeoue的 this指向问题
process.nextTick(function(){console.log(this)}//this指向的是全局对象global
//setImmedate 和setTimeout的this都指向的是他们自己,Immediate对象和Timeout对象,所以在使用时,一般使用箭头函数
setImmediate(()=>{console.log(this)})//global
setTimeout(()={console.log(this)})//global
复制代码
setTimeout((...args)=>{
console.log(args)
},1000,'xiaoming','吃饭')
复制代码
node模块中的arguments是什么?
//在模块中直接输入 arguments,
console.log(arguments)
//[exports,module,require,__filename,__dirname]
//是可以拿到arguments的 是因为jsnode模块,是一个闭包,这5个 是闭包的参数。
// { '0': {},
// '1':
// { [Function: require]
// resolve: { [Function: resolve] paths: [Function: paths] },
// main:
// Module {
// id: '.',
// exports: {},
// parent: null,
// filename: '/Users/shiqiao/study/20181123/1.process.js',
// loaded: false,
// children: [],
// paths: [Array] },
// extensions: { '.js': [Function], '.json': [Function], '.node': [Function] },
// cache: { '/Users/shiqiao/study/20181123/1.process.js': [Module] } },
// '2':
// Module {
// id: '.',
// exports: {},
// parent: null,
// filename: '/Users/shiqiao/study/20181123/1.process.js',
// loaded: false,
// children: [],
// paths:
// [ '/Users/shiqiao/study/20181123/node_modules',
// '/Users/shiqiao/study/node_modules',
// '/Users/shiqiao/node_modules',
// '/Users/node_modules',
// '/node_modules' ] },
// '3': '/Users/shiqiao/study/20181123/1.process.js',
// '4': '/Users/shiqiao/study/20181123' }
复制代码
// node模块化,是基于commonjs规范,文件读写不用发请求,天生自带模块化
// commonjs规范
// 1.定义如何创建一个模块,一个js文件就是一个模块
// 2.如何使用,require
// 3.如何导出,exports.*** /module.exports =
//是通过闭包的方式实现的模块化,所以隐式的会在我们的代码外面包一层自执行函数,有5个参数,分别是exports,module,require,__filename,__dirname;
(function(exports,module,require,__filename,__dirname){
exports = module.exports = this = {};
//code..
return module.exports
})(exports,module,require,__filename,__dirname)
复制代码
文件模块的创建、使用
- 使用模块 require(相对路径),如果是自己写的文件,要用过相对路径的方式;可以省略扩展名,因为require规定了默认的查找匹配规则 js->json->node,require是同步加载的。
let sum = (...args)=>{
return args.reduce((prev,next)=>{
return next + prev;
})
}
//向外报漏的三种方式
module.exports = sum;
exports.calc =sum;
global.sum = sum
复制代码
//对应module.exports导出
let cacl = require('./calc');
cacl(1,2,3)
//对应exports.xxx导出
let {cacl} = requir('./calc')
cacl(123)
//对应global报漏
sum(123)
复制代码
- require除了规定了模块扩展名匹配,同时还具备缓存模块的功能。
//同一个模块,多次引用,该模块只执行一次;
requir('./calc') // calc.js执行一次
requir('./calc')
requir('./calc')
console.log(require.cache)
require.cache会缓存自己和 引用的模块,以模块的绝对路径为key,以模块的Module作为value。再次引用时,因为缓存里有,就不会去加载了。
复制代码
es6 class创建一个模块
class dialog{
constructor(){
this.time = 3000;//类的私有属性
}
$show(){ //类的公有属性
console.log('show')
}
$hide(){
console.log(hide)
}
static title(){ //类的静态属性,类调用
return '弹框'
}
static say(a){//类的静态方法,类调用
console.log(a)
}
}
复制代码