【问题标题】:Calling function that uses global variable in another Module在另一个模块中调用使用全局变量的函数
【发布时间】:2021-05-13 08:03:24
【问题描述】:

如果我在其模块中定义了一个依赖(使用)全局变量的函数,如果我将它导出并尝试在该模块之外调用它会发生什么?

我已经尝试过了,发现它可以正常工作,尽管我无权访问该变量(它没有在我的范围内定义)。所以我想确定我是否理解这一点,这是否就像闭包函数并且函数从词法范围获取其变量?

PS:我的问题与 ES6 模块功能有关。

#添加真正简单的例子

这是我的 html:只是一个脚本

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script type="module" src="app.js"></script>
  </body>
</html>

这是我的模块文件:

let globalVariable = "I cannot be accessed outised this module";
export function testFunction() {
  console.log(globalVariable);
}

这是我的 app.js 文件:

import { testFunction } from "./module.js";

testFunction();

虽然在 app.js 中无法访问 globalVariable,但消息已在控制台中打印出来。

【问题讨论】:

  • 函数可以访问哪些变量仅取决于定义的位置和方式。在哪里调用它并不重要。这基本上是词法与动态范围。
  • 真的不清楚你在问什么。尝试提供minimal reproducible example
  • "这是否就像闭包函数,并且函数从词法范围中获取其变量?" 不,它不是“就像”闭包。从字面上看,它 is 完全是一个闭包。 JavaScript 中的所有函数都是闭包。
  • "我的问题与 ES6 模块功能有关。" 几乎没有。这只是一个基本的 JS 概念。有模块的事实是无关紧要的。当然,我想可能在模块中定义的函数不是闭包而是 1. 这将是迄今为止所有语言的工作方式的巨大变化。 2. 它会破坏拥有模块的目的。
  • @VLAZ 非常感谢您的澄清,您可以将其添加为答案以便我接受吗?

标签: javascript ecmascript-6 module closures


【解决方案1】:
let globalVariable = "I cannot be accessed outised this module";

这不是全局的。它只是模块范围内的一个变量。

export function testFunction() {
  console.log(globalVariable);
}

这个函数访问名为globalVariable的变量,无论它(函数)被传递到哪里,就像任何其他闭包一样。

延伸阅读:How do JavaScript closures work?

【讨论】:

  • 谢谢,我只是说模块的全局性。
猜你喜欢
  • 2017-04-23
  • 1970-01-01
  • 2012-10-26
  • 2017-08-02
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多