【发布时间】:2020-08-28 20:40:49
【问题描述】:
跟进What is file scope in javascript,从中我知道可能有也可能没有所谓的文件范围变量,但是,我确实记得在某个地方读过这个词,但再也找不到了,除了问答的What is file scope in javascript。总之,
我想知道这些导出的文件范围变量的确切行为定义是什么。
因为我试图动态切换我的机器人但无法做到,一一消除因素,它最终落在了我身上,这是因为这种“导出的文件范围变量”,而我不理解它们的行为.看看以下极其简化的机器人应用程序:
VarTestFileA.js
function nextBot() {
BotC = !BotC
return BotA[BotC]
}
function logBot() {
console.log("I:", bot)
}
const BotA = {true: {"token": 2}, false: {"token":3}}
let BotC = true
var bot = BotA[BotC]
module.exports = {
bot,
nextBot,
logBot,
}
VarTestFileB.js
const bt = require('./VarTestFileA')
console.log(bt.bot)
bt.bot = bt.nextBot()
bt.logBot()
console.log("O:", bt.bot)
bt.bot = bt.nextBot()
bt.logBot()
console.log("O:", bt.bot)
bt.bot = bt.nextBot()
bt.logBot()
console.log("O:", bt.bot)
您可能知道(即使没有运行它)无论我怎么做,bt.bot 都无法切换。这是输出:
$ node VarTestFileB.js
{ token: 2 }
I: { token: 2 }
O: { token: 3 }
I: { token: 2 }
O: { token: 2 }
I: { token: 2 }
O: { token: 3 }
另外,我尝试从VarTestFileA.js 中切换bot,它可以在其中工作,但console.log("O:", bt.bot.token) 从未显示更新的值。万事如意,
这一切都归结为此类导出文件范围变量的确切行为定义,因为如果将它们放在同一个文件中,它运行得非常好。于是就有了这个问题。
【问题讨论】:
-
能否请您包含每个实例的 console.log 输出?
-
谢谢,让我快速解释一下为什么会发生这种行为。我走了!
-
我花了一些时间来写答案,我有点忙,但我在下面提供了答案,解释了如何使用切换机器人并始终获得更新值的行为和解决方法.
标签: javascript ecmascript-6 es6-modules