「本文正在参与技术专题征文Node.js进阶之路,点击查看详情」
给node程序传递参数
正常情况下我们通过node xxx.js就可以执行我们执行我们的文件。在某些情况下我们希望给node传递一些参数。我们可以在文件名后面加上需要传递的参数。
node xxx.js age=18 haha
复制代码
我们可以在程序中通过process这个内置对象获取到传递的参数。
console.log(process);
复制代码
通过打印process这个内置对象,我们发现它里面包含了很多信息。
其中argv(argument vector)属性是一个数组,包含了我们传递过来的参数。第一个元素是node的安装路径,第二个参数是我们所在文件的路径,第三和第四个参数正是我们传递的参数。
我们通过argv数组下标来获取传递的参数,还可以遍历这个数组的参数信息。
console.log(process.argv[2]);
console.log(process.argv[3]);
process.argv.forEach(item => {
console.log(item);
})
复制代码
node的输出
console对象是一个全局对象。
- console.log: 最常用的输出内容方式
- console.clear: 清空控制台
- console.trace: 打印函数的调用栈。可以知道某个函数被哪些调用。
console.log(process.argv[2]);
console.log(process.argv[3]);
console.clear()
process.argv.forEach(item => {
console.log(item);
})
复制代码
我们可以看到当前控制台打印的是argv数组遍历的结果,前面process.argv[2]和process.argv[3]打印的结果已经被清空了。
通过console.trace()我们可以打印出函数的调用栈。
function foo() {
bar()
}
function bar() {
console.trace();
}
foo()
复制代码
全局对象
特殊的全局对象
特殊的全局对象可以在模块中任意使用,但是不能在命令行交互中使用,包括__dirname、__filename、exports、module、require()。
- __dirname:获取当前文件所在的路径,是绝对路径,不包括文件名。
- __filename:获取当前文件所在路径和文件名。
console.log(__dirname);
console.log(__filename);
复制代码
常用的全局对象
process对象
process对象提供了node进程中相关的信息,例如node的运行环境、参数信息等。当我们用node运行程序的时候,它会在操作系统里开启一个进程。
console对象
console对象上述已经介绍过。
定时器函数
- setTimeout(callback, delay[, …args]):callback在delay毫秒后执行一次;
- setInterval(callback, delay[, …args]):callback每delay毫秒重复执行一次;
- setImmediate(callback[, …args]):callbackI / O事件后的回调的“立即”执行;
- process.nextTick(callback[, …args]):添加到下一次tick队列中。
setTimeout(() => {
console.log('setTimeout');
}, 0)
setInterval(() => {
console.log('setInterval');
}, 1000)
setImmediate(() => {
console.log('setImmediate');
})
process.nextTick(() => {
console.log('process.nextTick');
})
复制代码
global对象
global是一个全局对象,前面提到的process、console、setTimeout等都被放到了global全局对象中。
console.log(global);
复制代码
在控制台输出了global全局对象一部分内容,并不是全部。
想要看到global全局对象的更多内容,我们可以在终端通过输入node进入交互式环境。然后在交互式环境中输入global.然后按两次tab键,就可以看到global全局对象的更多信息。
global和window的区别
在浏览器中,全局变量都是在window上的,比如有document、setInterval、setTimeout、alert、console等等。
在node中,global是全局对象。
在浏览器中执行的javascript代码,如果我们在顶级范围内通过var定义的一个属性,默认会被添加到window对象上。因为在浏览器中没有模块的概念,是最顶层的东西。
var age = 18
console.log(age);
复制代码
我们在浏览器中运行,并且在控制台中输入window,我们可以看到window对象中有age属性。
在node中,我们通过var定义一个变量,它只是在当前模块中有一个变量,不会放在全局中。因为在node中每个文件都是一个独立的模块,定义的变量是在模块里面。如果放在全局,另一个模块中定义相同的变量名会产生冲突。
然后我们在node环境中运行此文件。
var age = 18
console.log(age);
console.log(global.name);
复制代码
可以看到global对象中没有name属性。