我目前想共享一個(gè)實(shí)例變量。比如連接數(shù)據(jù)庫,在main.js里面實(shí)力化一次之后,其他的模塊想用數(shù)據(jù)庫,又得實(shí)例化一次。
比如main.js
let redisApi;
redisApi = new RedisApi();
user.js
console.log(redisApi);
這時(shí)候會(huì)報(bào)錯(cuò)提示redisApi這個(gè)變量未定義!
但是我改用eval初始化變量之后,就不一樣了
main.js
eval (`let redisApi;`);
redisApi = new RedisApi();
這時(shí)候,其他模塊都可以共享redisApi這個(gè)變量。
為啥eval可以做到這一點(diǎn),有誰可以解釋一下嗎?
光陰似箭催人老,日月如移越少年。
這里需要理解下Node.js中的模塊是如何被加載的。
和瀏覽器類似,Node.js的執(zhí)行環(huán)境中有一個(gè)global對(duì)象,類似DOM的window對(duì)象。
同理,
直接看代碼解釋:
//module1.js
console.log(global.testStr)//undefined
testStr = '123';//!!關(guān)鍵點(diǎn)?。?,這等于是給全局對(duì)象設(shè)置了一個(gè)名為testStr屬性。
console.log(global.testStr)//123
var test = function () {
console.log(testStr);
}
exports.test = test;
//index.js
require('./module1.js')
console.log(testStr)
//輸出:123
所以對(duì)照到你這段代碼就可以理解了,實(shí)際在生效的是redisApi = new RedisApi();
,eval (
`let redisApi;`);
聲明的變量是在另外一個(gè)獨(dú)立的作用域中,其實(shí)是無法訪問到的。
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的原文引用,規(guī)范就是這么定的,所以有你這樣的結(jié)果;不過一般不推薦這么玩;