【问题标题】:Why use Export and Import?为什么要使用导出和导入?
【发布时间】:2017-11-23 23:42:21
【问题描述】:

这个问题是关于 ES6 而不是全局变量。
当引入新的 ES2015 exportexport default 时。制作它们是为了让您可以使用import 在其他地方导入/获取相同的变量、值或项目。所以我有一个简单的问题。 为什么我们应该使用导出和导入,而不是仅仅创建一个简单的类对象并通过它获取项目,或者只是创建静态或全局变量?


我知道它可以用来让你的代码更简洁,也可以轻松地将代码放入多个文件中,但我们假设我们有first.jssecond.js,并且我们有一个名为names 的变量在我们想要在second.js 中获得的first.js 中。现在您可以使用importexport 或通过在second.js 中创建一个对象并通过该对象访问我们的变量来做到这一点。那么为什么使用导出和导入更好呢?

【问题讨论】:

  • 您的意思是“为什么要将代码拆分为多个文件,而不是将所有代码放在一个巨大的文件中?”嗯……
  • 如何将一个模块中定义的对象之一(读取:文件)放入另一个模块?正如你所说:全局变量。这真的很糟糕,而且很容易发生命名冲突。因此,您可以明确地import 某事,而不是隐式地假设它的全球存在
  • @ChrisG 你可以制作多个文件并使用对象对吧?
  • 如果你有 Java 背景,我认为 Java 没有什么不同。为什么不让 Java 中的所有内容都全局化,这样就不需要编写所有这些讨厌的导入?等等……那是因为这将是一团糟,与 JS 相比,Java 从来不允许这样做。
  • 通过在第二个中创建一个对象并通过该对象访问我们的变量 - 这是什么意思?这假设这个对象是全局的。而在模块化环境的情况下则不然。

标签: javascript oop object ecmascript-6


【解决方案1】:

export 被引入与import 一起使用(您需要明确声明以后需要导入的内容),作为 ES2015 模块标准的一部分。

在实现这些标准模块之前,只有使用非标准模块定义和/或模块加载器(如 RequireJS),才能将 Javascript 代码拆分为多个文件并且不让所有对象污染全局对象。最简单的情况是将代码包装在立即调用函数中。 ES6/2015 只是标准化了 Javascipt 模块。

现在你问为什么不在许多文件中只包含 Javascript 对象?答案是namespacing

【讨论】:

    【解决方案2】:

    实际上 - 你说得很好。

    命名空间的东西在 C++ 中。有很多人认为在他们使用的所有东西前面都有一个命名空间指示器很酷。 所以,他们的整个程序没有说{ cout << my_string << endl; },而是{ std::cout << my_string << std::endl; }。 有时你会看到像{ disk::io::byte::bit::atom::neutron::quark::say_hi(2) } 这样的东西。而且,写这篇文章的人认为他是一个超级开发者。

    但是,由于它们是纯粹的,你更有可能看到{ std::cout << myString << endl; },因为骆驼大小写比人类可读的字符串更优先。

    现在,在 node.js 中,我总是在做类似 const ClassFromMod = require('mod-with-class') 的事情。在文件中,你必须说module.exports = ClassDeclaredInHere。我总是这样做,因为真的,有没有其他方法提供?

    或者你可以这样做const {ClassFromMod} = require('mod-with-class')。 那么你必须拥有,module.exports.ClassFromMod = ClassDeclaredInHere

    所以,在浏览器中做同样的事情是可以的。但是,现在全局上下文和本地上下文更难使用 - 真的。当你必须的时候,在模块之间共享东西有点困难。但是,不必担心几乎所有时间人们都对他们的模块进行了恰到好处的分区。那是因为他们是人——实际上是那种比负责核反应堆的人更谨慎的人——因为这些人会做一些网络编程。因此,在分区模块方面没有切尔诺贝利。对吧?

    现在,您可以开始使用类 def。而且,这个类本身就是一个命名空间。

    那么,为什么没有类的全局注册表?只是可能不同的公司(个人开发人员)会对两个远程不同的类使用相同的名称。但是,可能会有一些解决方法。

    一种方法可能是将类分配给使用(命名空间排序)。但是,它可能更明确。就像具有汽车功能的东西的“引擎”,或者运行脚本的东西的“引擎”。编程语言可能有“在这里谈论汽车”之类的东西。那会是什么样子?

     start>> talking about cars <
     let bval = engine.rev()
     if ( bval ) {
       <about scripts> engine.run("small program")
     }
     <<stop talking about car
    

    这是一个想法。看着它,我不喜欢它。这有点像许多语言使用的“with”。

    因此,由于对编程环境施加了新的限制,您会遇到错误和范围问题,这会增加您漫长而漫长的一天。但是,你应该明白,你从清晰的思维中得出的问题在某种意义上被一小群有能力的人压倒了。而且,您可以为他们倒垃圾。

    那么,如何通过特性识别对象并启用某种平面命名空间管理呢?可以由人工智能驱动。三十年前就可以做到。但是,现在就是现在。但是,未来的存在是为了纠正过去的错误。

    【讨论】:

      猜你喜欢
      • 2017-12-11
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 2021-11-03
      相关资源
      最近更新 更多