首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不同的文件中导入相同的javascript模块,共享相同的词法范围

在不同的文件中导入相同的javascript模块,共享相同的词法范围
EN

Stack Overflow用户
提问于 2021-11-11 03:07:19
回答 1查看 470关注 0票数 0

所以我有一个叫做"fruits.js“的文件

在这个模块中,我有一个带有值"apples“的全局变量" name”,我还为这个变量提供了一个getter和setter来获取变量名的值并为其设置一个新的变量名。

现在,我将这个模块导入到一个名为"client1.js“的文件中,并运行getter,它显示了"apples”。

现在,我运行setter的值“椰子”,并改变了变量。

现在,在client1.js完成执行之后,client2.js使用相同的复制代码启动执行。

而不是“苹果”,而是“椰子”。

因此,我的问题是,同一个模块的多个导入是否共享相同的词法范围?

密码-

代码语言:javascript
复制
// 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-11 03:18:11

模块的代码在第一次导入时只被加载和初始化一次。在此之后,在随后导入它的尝试中返回完全相同的模块句柄。

因此,在您执行module.exports = set()时,您正在运行该函数set(),该函数返回一个对象,该对象具有对能够看到本地作用域的本地函数的引用。任何导入该函数的人都将得到完全相同的导出对象,因此,他们都将指向相同的本地作用域(在此模块中)。

如果从setFruit("banana")内部调用moduleA,然后从moduleB中调用getFruit(),则会得到"banana"。fruits模块只有一组状态和一个内部fruits变量,所有对其导出方法的调用都可以访问这些变量。

所以我的问题是,同一个模块的多个导入是否共享相同的词法范围?

你在这里使用“词汇范围”这个词有点让人困惑。导入另一个模块的两个模块都有自己的词法作用域,但是导入模块中的代码存在于它自己的作用域中,不管是谁导入它都不会改变。

因此,如果moduleA和moduleB分别导入您的水果模块,那么将有三个作用域,因为每个模块在顶层都有自己的词法作用域。当您调用水果函数时,该函数在水果词法范围内(在函数的执行过程中)内部操作。当您从moduleA或moduleB中获得返回值时,您将在这些模块的作用域内操作。没有混合的范围。每个模块都有自己的顶级范围。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69922721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档