【问题标题】:Javascript file or module scope only variablesJavascript 文件或模块范围仅变量
【发布时间】:2018-05-22 07:05:04
【问题描述】:

如果我错了,请纠正我,函数require() 以某种方式将.js 文件导入到当前文档中,因此如果var name 都在两个模块中,那么第二个模块会覆盖第一个模块吗?
以及如何定义仅文件范围的变量

请注意,我想在 .js 文件中的任何函数之外定义我的变量,而不是在 global scope

解决方法是什么,使用关键字var 会影响变量范围吗,在javascript 中定义function 以外的范围,module 对象是否可以用于在一个中定义私有变量文件

module1.js

var name = 'i am module 1' 

foo = () => console.log(name)

module.exports = foo

module2.js

var name = 'i am module 2' 

foo = () => console.log(name)

module.exports = foo

ma​​in.js

const module1 = require('./module1')
const module2 = require('./module2')

module1() // "i am module 1" or "i am module 2"?
module2() // "i am module 2"

【问题讨论】:

  • "i am module 1" or "i am module 2"? 那么,是哪一个?它只会输出其中之一,您的大量测试向您展示了什么?
  • 有点困惑我使用了 var 关键字并且没有使用它现在坚持使用它因为它有效,我想了解什么定义了除函数之外的变量范围以及我如何将我的项目划分为单独的文件而不用担心相互污染范围

标签: javascript node.js module scope


【解决方案1】:

在 javascript 中,当您直接在“.html”文件中加载 .js 文件时,在函数外部声明的变量会在全局范围内注册。为了防止这种事情人们开始使用IIFE 函数并将单个文件包装在IIFE 中。但是在现代Javascript 中,您可以像我们在Nodejs 中使用的那样使用modules 和模块加载器来加载这些文件。现在现代浏览器支持ECMAScript modules,可以直接使用。

使用模块的主要好处是您不必使用IIFE 函数来阻止在全局范围内注册的变量。现在,该文件中声明的每个变量都是该文件私有的,除非您将其导出。

例如: 模块1.js

var name = 'my name';

function getName(){
    return name;
}

module.exports  = {
    getName
}

在上面的例子中,name 是这个文件私有的,只有你不能在另一个文件中使用它,除非你导出它。

【讨论】:

  • 所以require() 尊重modules.exports 那么你如何在模块中定义一个全局var 并仍然使用require(),你必须导出才能成为全局范围吗?
  • Nodejs 中,我们可以向globals 添加属性,在browsers 中,我们可以向window 对象添加属性,但污染global scope 并不是最佳实践。如果您想在一个文件中使用propertiesfunctions 到另一个文件,那么您应该从该文件中使用export 并在您要使用的另一个文件中使用import/require
猜你喜欢
  • 2014-01-20
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多