node.js - 关于nodejs中 eval的疑问

查看:966
本文介绍了node.js - 关于nodejs中 eval的疑问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我目前想共享一个实例变量。比如连接数据库,在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对象。
同理,
直接看代码解释:


//module1.js
console.log(global.testStr)//undefined
testStr = '123';//!!关键点!!,这等于是给全局对象设置了一个名为testStr属性。
console.log(global.testStr)//123
var test = function () {
    console.log(testStr);
}

exports.test = test;

//index.js
require('./module1.js')

console.log(testStr)
//输出:123

所以对照到你这段代码就可以理解了,实际在生效的是redisApi = new RedisApi();eval (`let redisApi;`);声明的变量是在另外一个独立的作用域中,其实是无法访问到的。

这篇关于node.js - 关于nodejs中 eval的疑问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆