【问题标题】:es6 import for side effects meaninges6 导入的副作用含义
【发布时间】:2016-12-13 17:48:22
【问题描述】:

我正在阅读 es6 导入语句 reference on MDN。语法:

import "my-module";

将导入整个模块仅用于副作用,而不导入任何绑定。我不确定副作用是什么意思。我一直用 angularimport "angular"。 Angular 绑定到窗口但不返回对象。所以我不确定这是否会被称为副作用。

【问题讨论】:

    标签: javascript import ecmascript-6


    【解决方案1】:

    当您需要导入不导出任何内容但执行其他操作的内容时,这是一个仅具有副作用的模块。你导入它只是为了初始化它。

    纯和非纯模块

    如果您将模块视为函数,那么仅通过导出其内容来影响作用域的模块就像一个始终返回相同内容的函数(一个没有参数的纯函数)。无论您将 React 15.01 导入多少次,您总是会得到一个包含相同方法的对象。

    具有副作用的模块是以其他方式改变范围然后返回一些东西的模块,它的效果并不总是可预测的,并且可能受到外部力量的影响(非纯函数)。例如,polyfill 可能不会做任何事情,因为它发现它启用的功能已经被浏览器支持。

    副作用示例:

    • Angular 绑定到全局 window 对象,但不导出 任何东西。
    • 在浏览器中启用 ES6 功能的 polyfill 支持他们,就像babel polyfill 是一个副作用。
    • 许多 jQuery 插件将自己附加到全局 jQuery 对象。
    • 在后台运行、监控用户交互并将数据发送到服务器的分析模块。
    • 如果您不使用 CSS 模块,在 webpack 中导入 CSS 可能会被视为副作用。

    【讨论】:

      【解决方案2】:

      这是一个例子:

      //a.js
      function print1()
      {
        console.log("export print1 is working");
      }
      
      function print2()
      {
        console.log("non-export print2 is working");
      }
      
      print1();
      print2();
      
      //b.js
      import "a.js";
      

      当你运行“b.js”时,你会看到打印出来的消息,叫做side effects

      【讨论】:

        【解决方案3】:

        考虑下面作为示例代码。 当您尝试导入某些东西时,它不会导出任何东西,但会做很多事情并覆盖您现有的代码(如果有的话),这就是副作用。

        import Ember from 'ember';
        Ember.RSVP.configure('onerror', function(error) {
            ....
        });
        

        app.js:

        import './overrides/extra';
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-01
          • 2016-06-24
          • 1970-01-01
          • 1970-01-01
          • 2018-07-04
          相关资源
          最近更新 更多