翻译 -- Modules in ECMAScript 6

本文介绍JavaScript模块化的多种方式,从IIFE到CommonJS再到ES6模块。通过具体示例展示了不同场景下模块定义的方法,包括类的使用及导出、导入语法。

原文地址

    我们对于可以导入模块依赖到自己的代码中的需求随着大量JavaScript框架的涌现也越来越多。

JS中有无数地方使用了这些框架,或者你已经早就对它们很熟悉了,就像MooTools,jquery,甚至common.js和require.js。

    直到最近,最早执行模块是靠可以自我执行的匿名函数,也就是所谓的立即执行函数(Immediately-Invoked Function Expression, IIFE )。

    我有点偏题了,那么,可以自我执行的匿名函数是怎样运行的呢?它类似于下面这样:

//Module Starts


(function(window){

    var sum = function(x , y){
        return x+y;
    }
    var sub = function(x, y){
        return x - y;
    }
    var math = {
        findSum: function(a, b){
            return sum(a, b);
        },
        findSub: function(a, b){
            return sub(a, b);
        }
    }
    window.math = math;
})(window);
console.log(math.findSum(1, 2));//3
console.log(math.findSub(1, 2));//-1

如果你对上面的不陌生,你也不会对jquery也使用这样的模块感到惊讶。如果上面的看上去陌生,请多看几次。

你或许会对以下代码感到奇怪:

(function(window){


})(window);

那么,以上代码被用来干什么呢?它们被设计用来分割作用域以及避免函数和变量与其它代码混合。

这里有一些JS的库和环境做得更好,允许你把模块放进上面的文件,当我们需要什么JS模块,就调用什么模块。

比如:

新建一个math.js,在里面写上: 

var  sum = function (x, y) {
    return x + y;
}
var sub = function (x, y) {
    return x - y;
}
var math = {
    findSum: function (a, b) {
        return sum(a, b);
    },


    findSub: function (a, b) {
        return sub(a, b);
    }
};

exports.math = math;

再在同目录下的另一个js中写入:

var math = require("./math").math;
console.log(math.findSum(1, 2)); //3

console.log(math.findSub(1, 2)); //-1

在上面的2个js文件中,第二个js可以通过require.函数导入math.js并运行它。如果你懂一点Node.js,那么你也应该熟悉这种语法。这种设计被称为模块异定义(Asynchronous Module Definition, AMD),允许我们使用这些库的规范称为commonJS,同样它也适用于大多数Node应用。它比立即执行函数更简单和直观,但不幸的是,大多数情况下它(CommonJS)只适用于服务器端,。

当然,现在有很多解决办法使我们在浏览器端使用AMD规范,但是它们还是不够完美。幸好ES6出现了,它允许我们像在AMD里面简单而自然(inherently and simply)得使用模块。

定义模块

这里有一个很简单的例子--我们有一个模块,名为math,一个属性名为pi,一个方法名为sum。那我们怎么创建一个模块呢?我们先创建一个叫lib的文件夹,里面创建一个叫math的文件。math代码如下:

export class Math {
constructor() {
       this.sum = function(x, y){
           return x + y;
       }
       this.pi  = 3.141593;
   }

 findSum(a, b) {
       return this.sum(a, b);
   }
 getPi() {
       return this.pi;
   }

}

如果你思路跟上了,你会发现这个类的语法看上去非常自然。如果你想知道我到底想表达什么,那就开始看看这个类吧。

我们可以看到,这个类暴露了两个方法。另一个关键组件是export。这个export就是我们要暴露的。那么它的实现呢?对于项目中的每个文件,我们只需要执行对应的import指令。记住,我们保存的math.js,导入之后,要在变量中创建类的实例,就是这样!

import {Math} from 'lib/math';
var math = new Math();
console.log(math.findSum(1, 2)); //3

console.log(math.getPi()); //3.141593

上面的代码到底怎么回事?不要慌,最关键的点是我们要把两个东西用在import里面:可以用于导入的类的名字(这里指Math),和它的文件所在路径(lib/math)。做完这些以后,我们可以声明它的实例,并且使用它而不会有任何差错。

再来一个例子如何?我们设置可以不用class,请注意观察我声明的文件:

//File: directory/name.js
export var environment = 'develop';
export var userName = 'Moshe';
export function sum(x,y) { return x + y;};


//Other file
import * as names from "directory/name";
console.log(names.environment); //develop
console.log(names.userName); //Moshe
console.log(names.sum(2,3)); //5

棒极了!我们可以导入任何我们暴露的对象。注意我们可以使用这个:

import {environment, userName, sum} as names from "directory/name";

也可以使用 "*"去获取所有对象。我们在一个变量内部进行的导入,现在我们执行的所有导出都可以被使用而且不必担心问题和作用域。现在谁还敢说这个不好或者不简洁么?

代码转载自:https://pan.quark.cn/s/a4b39357ea24 在本项研究中,我们研究了如何运用8155微处理器扩展单元与74LS164串行到并行转换电路来操控八段数码管的显示。74LS164被视为一个核心部件,它使得串行数据能够转化为并行输出,这对于驱动数码管极为关键,因为数码管普遍需要并行数据输入来点亮不同的段。74LS164的功能机制在于接收串行输入的数据,并在每个时钟脉冲之后将其转化为并行输出。在该配置中,8155的PB0引脚被用来管理数据位的输入,而PB1则承担时钟信号的角色。这表明我们可以通过调控8155的这两个引脚来决定何时将数据传输至74LS164,以及何时执行位移操作。 在编程层面,我们需要开发一段代码来处理上述流程。在提供的代码示例中,`DAT164`标识数据位地址,`CLK164`指代时钟位地址。`LEDBuf`是一个用于存放待显示数字的缓冲存储区,而`Num`则用于保存待显示的数值。`DisplayLED`子程序负责将数据从缓冲区`LEDBuf`搬运到74LS164,并通过8155的PB0和PB1引脚来调控74LS164的输入与时钟。 在`DisplayLED`子程序的操作中,首先会关闭所有的八段数码管,然后逐位从缓冲区`LEDBuf`中读取数据,通过循环右移指令(`rlc`)进行数据位移,并将最低位送入74LS164。在每次数据传输完成后,会通过变换PB1的电平(交替高低电平)来生成时钟脉冲,使74LS164能够接收新的数据。这一过程会重复8次,确保所有8段数码管的段码都被精确设置。通过调整`OUTBIT`的值来选择特定的数码管进行显示。 另外,实验还包含了8155 I/O/RAM扩展单元的应用。8155芯片提供...
内容概要:本文系统研究了计及电动汽车充电站接入的配电网承载能力评估与优化问题,提出了一套完整的基于Matlab代码实现的双层评价模型。通过构建涵盖系统安全性、经济性、电能质量及设备利用率等多维度的指标体系,采用熵权法进行客观权重计算,并结合模糊综合评价法实现承载能力的量化评分,全面评估不同渗透率下电动汽车接入对配电网的影响。研究通过算例仿真深入分析了各项指标的变化规律与灵敏度特性,验证了所提模型在承载能力动态评估中的科学性与实用性,为高比例电动汽车接入背景下的配电网规划、扩容改造与运行调度提供了有力的决策支持和技术路径。; 适合人群:具备电力系统分析基础、熟悉Matlab编程工具,从事新能源并网、智能配电网、电动汽车与电网互动(V2G)、电网承载力评估等相关领域的科研人员、工程技术人员及研究生。; 使用场景及目标:①科学评估大规模电动汽车充电负荷对配电网安全稳定运行的冲击及其承载极限;②优化充电站选址与接入策略以提升电网接纳能力;③为配电网的扩容规划、无功优化与调度运行提供量化的分析依据;④支撑相关科研项目、学位论文的建模、仿真与实证分析工作。; 阅读建议:建议结合文中提供的Matlab代码与详细的仿真算例进行复现,重点掌握熵权法确定权重与模糊综合评价的实现逻辑,深入理解各评估指标的物理含义及其在不同场景下的灵敏度表现,并可尝试将其拓展应用于其他类型的分布式电源接入评估或采用不同的优化算法进行模型改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值