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传参
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' }

复制代码
  • 为什么会有arguments?
// 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)
    }
}

复制代码