ECMAScript 6 语法学习——模块

在ECMAScript 5及早先版本中,一直没有模块体系,使得无法将一个复杂的应用拆分成不同的功能模块,再组合起来使用。因此,JavaScript社区制定了一些模块加载方案,最主要的有CommonJS和AMD两种。
而在ECMAScript 6中,实现了模块功能,以更简单的方式取代CommonJS和AMD规范,现在已经成为浏览器和服务器通用的模块解决方案。

使用export关键字直接导出模块

// 文件 modules.js

// 导出数据
export var color = "red"
export let name = "module"
export const sizeOfPage = 10

// 导出函数
export function sum(a, b) {
    return a + b
}

// 以下内容将在模块末尾进行导出
function subtract(a, b) {
    return a - b
}

function multiply(a, b) {
    return a * b
}

function divide(a, b) {
    return a / b
}

// 导出类
export class Car {
    constructor(color, doors) {
        this.color = color
        this.doors = doors
    }

    showColor() {
        console.log(this.color)
    }
}

// 模块私有变量
var count = 0
// 模块私有函数
function changeCount() {
    count++
}

// 导出multiply函数
export {multiply}
// subtract是本地名称,sub是导出时使用的名称
export {subtract as sub}
// 导出模块的默认值
export default divide

需要说明的是:

  1. 导出时可以分别对变量、函数和类进行导出,也可以将导出语句集中写在模块的尾部,当导出的内容较多时,采用后者会更加清晰。
  2. 没有添加export关键字而定义的变量、函数和类在模块外部是不允许被访问的。
  3. 导出的函数和类声明都需要一个名称,如上述代码所示。如果要采用一个不同的名称导出变量、函数或者类,可以使用as关键字来指定变量、函数或者类在模块外应该按照什么样的名字来使用。
  4. 一个模块可以导出且只能导出一个默认值,默认值是通过使用default关键字指定的单个变量、函数、或者类。非默认值的导出,需要使用一对花括号包裹名称,而默认值的导出则不需要
  5. 默认值的导出还可以采用下面两种语法形式。

代码示例如下

// 使用default关键字导出一个函数作为模块的默认值
// 因为导出的函数被模块所代表,所以它不需要一个名称
export default function(a, b) {
    if (b !== 0) {
        return a / b
    }
}
function divide(a, b) {
    if (b !== 0) {
        return a / b
    }
}

export {divide as default}

如果想在一条导出语句中指定多个导出(包括默认导出),那么就需要用到第三种语法形式。

将modules.js中模块尾部的导出合并

export {
    multiply,
    subtract as sub,
    divide as default
}

下面再来看一下导入。导入是通过使用import关键字来引入其他模块导出的功能。import语句由两个部分组成:

  • 要导入的标识符
  • 标识符所在模块

代码示例如下

// 文件 index.js

// 导入模块默认值
import divide from "./modules.js"
// 导入多个绑定
import {color, name, sizeOfPage} from "./modules.js"
// 导入单个绑定
import {multiply} from "./modules.js"
// 因modules模块中导出subtract函数时使用了名称sub,这里导入也要使用该名称
import {sub} from "./modules.js"
// 导入时重命名导入的函数
import {sum as add} from "./modules.js"
// 导入类
import {Car} from "./modules.js"
// 导入整个模块
import * as example from "./modules.js"

// red
console.log(color)
// module
console.log(name)
// 10
console.log(sizeOfPage)
// 只能用add而不能用sum
console.log(add(6, 2))
console.log(sub(6, 2))
console.log(multiply(6, 2))
console.log(divide(6, 2))

let car = new Car("black", 4)
// black
car.showColor()
// module

console.log(example.name)
// 注意这里是sum,而不是add
console.log(example.sum(6, 2))
// count是modules模块私有的变量,在外部不能访问
// 输出 undefined
console.log(example.count)
// changeCount()函数是modules模块的私有函数,在外部不能访问
// TypeError: example.changeCount is not a function
console.log(example.changeCount())

需要说明的是:

  1. 导入模块时,模块文件的位置可以使用相对路径,也可以使用绝对路径。使用相对路径时,对于同一目录下的文件,不能使用modules.js来引入,而要使用./modules.js,即通过"."来表示当前目录。
  2. 导入时,可以导入单个绑定,也可以同时导入多个绑定。导入时也可以使用as关键字对导入的绑定重新命名。
  3. 对于模块非默认值的导入,需要使用一对花括号包裹名称,而默认值的导入则不需要。
  4. 可以导入整个模块作为一个单一对象,然后所有的导出将作为该对象的属性使用。
  5. 多个import语句引用同一个模块,该模块也只执行一次。被导入的模块代码执行后,实例化后的模块被保存在内存中,只要另一个import语句引用它就可以重复使用它。
  • 另: export和import语句必须在其他语句或者函数之外使用,换句话说,import和export语句只能在模块的顶层使用
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352