所以我有一个叫做"fruits.js“的文件
在这个模块中,我有一个带有值"apples“的全局变量" name”,我还为这个变量提供了一个getter和setter来获取变量名的值并为其设置一个新的变量名。
现在,我将这个模块导入到一个名为"client1.js“的文件中,并运行getter,它显示了"apples”。
现在,我运行setter的值“椰子”,并改变了变量。
现在,在client1.js完成执行之后,client2.js使用相同的复制代码启动执行。
而不是“苹果”,而是“椰子”。
因此,我的问题是,同一个模块的多个导入是否共享相同的词法范围?
密码-
// fruits.js
let fruit = "apples";
const set = () => {
let flower = "lily";
const setfruit = (newfruit) => {
fruit = newfruit;
}
const getfruit = () => {
return fruit;
}
const setflower = (newflower) => {
flower = newflower;
}
const getflower = () => {
return flower;
}
return {
setfruit,
getfruit,
setflower,
getflower
}
}
module.exports = set();
// client1.js
const fruitsnflowers = require("./closure.js")
const execute = () => {
console.log(fruitsnflowers.getfruit())
console.log(fruitsnflowers.getflower())
fruitsnflowers.setfruit("coconut")
fruitsnflowers.setflower("hibiscus")
}
module.exports = execute;
// client2.js
const fruitsnflowers = require("./closure.js")
const execute = () => {
console.log(fruitsnflowers.getfruit())
console.log(fruitsnflowers.getflower())
fruitsnflowers.setfruit("papaya")
fruitsnflowers.setflower("lotus")
}
module.exports = execute;
// driver.js
const client1 = require("./client1.js")
const client2 = require("./client2.js")
client1()
client2()
// output
~ node driver.js
apples
lily
coconut
hibiscus发布于 2021-11-11 03:18:11
模块的代码在第一次导入时只被加载和初始化一次。在此之后,在随后导入它的尝试中返回完全相同的模块句柄。
因此,在您执行module.exports = set()时,您正在运行该函数set(),该函数返回一个对象,该对象具有对能够看到本地作用域的本地函数的引用。任何导入该函数的人都将得到完全相同的导出对象,因此,他们都将指向相同的本地作用域(在此模块中)。
如果从setFruit("banana")内部调用moduleA,然后从moduleB中调用getFruit(),则会得到"banana"。fruits模块只有一组状态和一个内部fruits变量,所有对其导出方法的调用都可以访问这些变量。
所以我的问题是,同一个模块的多个导入是否共享相同的词法范围?
你在这里使用“词汇范围”这个词有点让人困惑。导入另一个模块的两个模块都有自己的词法作用域,但是导入模块中的代码存在于它自己的作用域中,不管是谁导入它都不会改变。
因此,如果moduleA和moduleB分别导入您的水果模块,那么将有三个作用域,因为每个模块在顶层都有自己的词法作用域。当您调用水果函数时,该函数在水果词法范围内(在函数的执行过程中)内部操作。当您从moduleA或moduleB中获得返回值时,您将在这些模块的作用域内操作。没有混合的范围。每个模块都有自己的顶级范围。
https://stackoverflow.com/questions/69922721
复制相似问题