我目前想共享一个实例变量。比如连接数据库,在main.js里面实力化一次之后,其他的模块想用数据库,又得实例化一次。
比如main.js
let redisApi;
redisApi = new RedisApi();
user.js
console.log(redisApi);
这时候会报错提示redisApi这个变量未定义!
但是我改用eval初始化变量之后,就不一样了
main.js
eval (`let redisApi;`);
redisApi = new RedisApi();
这时候,其他模块都可以共享redisApi这个变量。
为啥eval可以做到这一点,有谁可以解释一下吗?
这里需要理解下Node.js中的模块是如何被加载的。
和浏览器类似,Node.js的执行环境中有一个global对象,类似DOM的window对象。
同理,
直接看代码解释:
所以对照到你这段代码就可以理解了,实际在生效的是
redisApi = new RedisApi();
,eval (
`let redisApi;`);
声明的变量是在另外一个独立的作用域中,其实是无法访问到的。这是es6的原文引用,规范就是这么定的,所以有你这样的结果;不过一般不推荐这么玩;