持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
区别
关于模块化和作用域的问题本篇文章主要记录关于this的不同环境的指向区别
Node和JavaScript中的this是有区别的,不光是这样,Node在控制台使用命令和加载脚本文件的策略也有所不同,但JS在脚本文件和控制台浏览器环境的this指向是相同的,本节我将记录这些知识点供大家参考,并用实际的例子作为更好的理解
浏览器控制台和node控制台中的this
这里的node控制台指的是node repl,是Node自带的交互式解释器(又名Node shell),表示一个电脑的虚拟环境,类似 Window 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,我们可以在node安装包中进行打开。
全局的this,分别在Node Repl和Chrome控制台中运行的效果
浏览器控制台
浏览器环境全局this指向window
node repl
node repl全局this指向global
从下图我们可以看出node声明的全局变量会挂载在global下
在脚本中的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