我目前想共用一個實例變數。例如連接資料庫,在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可以做到這一點,有誰可以解釋一下嗎?
迷茫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;`);
聲明的變數是在另外一個獨立的作用域中,其實是無法存取的。
黄舟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 e。 eval is the global code portion of that Program.
這是es6的原文引用,規範就是這麼定的,所以有你這樣的結果;不過一般不推薦這麼玩;