node基础
- node是单线程的
- 基本使用:
- 模块引用 require('./math'),返回值是一个对象
- 一般调用时候var math=require('./math'),math为一个对象。
- 但是定义的模块中的变量只作用在所在模块的作用域中,其他的作用域拿不到
- 所以引用了exports方法将外部需要引用的函数或者变量暴露出来。
- 例如:
exports.add=function (x,y) {return x+y;}
- 调用时候直接math.add(2,3)即可
- 注意:模块引用的路径必须以./或者../开头
global
- node中没有window全局变量,但是有一个相当于window的全局变量global
- 在全局中创建的属性和方法和变量都是在global中保存
- 如何验证global对象的存在?
console.log(arguments.callee); //[Function]
console.log(arguments.callee+''); //将global全局转化为字符串显示,相当于调用了toString方法
模块分类
- 系统模块 node引擎自己提供的模块,引用时直接var fs=require('fs');不用写路径
- 文件模块 自己定义的,就像上面例子中的math模块的引用
node执行模块代码的五个参数
- exports:将该模块中的函数或者变量暴露出去,外部可以引用
- require:引用模块
- module:代表当前模块本身,exports是module的一个属性,调用时候可以exports.或者module.exports
- __dirname:当前模块所在的完整绝对路径的文件夹
- __filename:当前模块文件的完整绝对路径
注意:exports和module.exports区别?
1、exports暴露本质是一个对象,module.exports暴露的是一个属性
2、此时如果再次声明module.exports = {},会将之前的覆盖
注意:暴露的本质是module.exports对象,exports只能通过点取的方式暴露,相当于往exports对象中添加新的属性,如果是=的方式,会打破原来对象地址的引用,指向新的对象。这个新的对象是不能被暴露出去的。
module.exports = { //此时如果再次声明module.exports = {},会将之前的覆盖
foo() {
console.log('moudle1 foo()')
}
}
3、exports.xxx相当于给变量添加新的属性,可以重复进行暴露
exports.foo = function () {
console.log('module3 foo()')
}
exports.bar = function () {
console.log('module3 bar()')
}