Node.js入门笔记(2):模块化与作用域

139 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

区别

关于模块化和作用域的问题本篇文章主要记录关于this的不同环境的指向区别

Node和JavaScript中的this是有区别的,不光是这样,Node在控制台使用命令和加载脚本文件的策略也有所不同,但JS在脚本文件和控制台浏览器环境的this指向是相同的,本节我将记录这些知识点供大家参考,并用实际的例子作为更好的理解

浏览器控制台和node控制台中的this

这里的node控制台指的是node repl,是Node自带的交互式解释器(又名Node shell),表示一个电脑的虚拟环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,我们可以在node安装包中进行打开。

image.png

全局的this,分别在Node Repl和Chrome控制台中运行的效果

浏览器控制台

浏览器环境全局this指向window image.png

node repl

node repl全局this指向global image.png

从下图我们可以看出node声明的全局变量会挂载在global下 image.png

在脚本中的this区别

以下代码都在js中执行

var jiahao = 666
console.log(this.jiahao) //undefined
console.log(global.jiahao) //undefined

从上面我们可以看出来在脚本中全局变量在脚本中不会被挂载到全局的this或者是global上

jiahao = 666
console.log(this.jiahao) //undefined
console.log(global.jiahao) //666

如果不用var和let声明的话会被加入到gloabal对象上,再看下下面的例子

this.jiahao = 666
console.log(module.exports.jiahao); //666

脚本中的this指向的是module.exports

this总结

1.Node repl中this和global可以看做指向同一对象 2.Node在脚本的this指向module.exports

作用域种类

全局作用域

定义在全局作用域上的变量可以通过global对象访问到

//test.js
jaho = 666
console.log(global.jaho) //666

在不同文件中可以访问到全局作用域

var file1 = require('./test1');
console.log(global.jaho) //666

模块作用域

使用var、let或者const修饰的变量都位于模块作用域中,不同模块作用域之间的作用域是隔离的,模块作用域中this指向module.exports

this.jaho = 666
console.log(module.exports);//666