搜索

首页  >  问答  >  正文

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可以做到这一点,有谁可以解释一下吗?

大家讲道理大家讲道理2740 天前631

全部回复(2)我来回复

  • 迷茫

    迷茫2017-05-31 10:40:28

    这里需要理解下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;`);声明的变量是在另外一个独立的作用域中,其实是无法访问到的。

    回复
    0
  • 黄舟

    黄舟2017-05-31 10:40:28

    Eval code is the source text supplied to the built-in eval function. More precisely, if the parameter to the built-in eval function is a String, it is treated as an ECMAScript Program. The eval code for a particular invocation of eval is the global code portion of that Program.

    这是es6的原文引用,规范就是这么定的,所以有你这样的结果;不过一般不推荐这么玩;

    回复
    0
  • 取消回复