什么是模块?

模块( Modules )是使用不同方式加载的 JS文件(与JS原先的脚本加载方式相对)。这种不同模式很有必要,因为它与脚本( script )有大大不同的语义:

  • 模块代码自动运行在严格模式下,并且没有任何办法跳出严格模式;
  • 在模块的顶级作用域创建的变量,不会被自动添加到共享的全局作用域,它们只会在模块顶级作用域的内部存在;
  • 模块顶级作用域的 this 值为 undefined ;
  • 模块不允许在代码中使用 HTML 风格的注释(这是 JS 来自于早期浏览器的历史遗留特性);
  • 对于需要让模块外部代码访问的内容,模块必须导出它们;
  • 允许模块从其他模块导入绑定。

基本的导出

你可以使用 export 关键字将已发布代码部分公开给其他模块。最简单方法就是将export放置在任意变量、函数或类声明之前,从模块中将它们公开出去:

// 导出数据
export var color = "red";
export let name = "Nicholas";
export const magicNumber = 7;
// 导出函数
export function sum(num1, num2) {return num1 + num1;
}
// 导出类
export class Rectangle {constructor(length, width) {this.length = length;this.width = width;}
}
// 此函数为模块私有
function subtract(num1, num2) {return num1 - num2;
}
// 定义一个函数……
function multiply(num1, num2) {return num1 * num2;
}
// ……稍后将其导出
export { multiply };

要求:

  • 导出的函数声明与类声明必须要有名称

基本导入

import { sum, multiply } from "./example.js";

import后面的括号里写上需要导入到方法名,多个用’,'号隔开

要求:

  • 你对同一个模块使用了多少次 import 语句,该模块都只会被执行一次。

完全导入一个模块

还有一种特殊情况,即允许你将整个模块当作单一对象进行导入,该模块的所有导出都会作为对象的属性存在。例如:

// 完全导入
import * as example from "./example.js";
console.log(example.sum(1,
example.magicNumber)); // 8
console.log(example.multiply(1, 2)); //

重命名导出与导入

你可能并不想使用从模块中导出的变量、函数或类的原始名称。假设你想用不同的名称来导出一个函数,你可以使用 as 关键字来指定新的名称,以便在模块外部用此名称指代目标函数

function sum(num1, num2) {return num1 + num2;
}
export { sum as add };

此处的 sum() 函数被作为 add() 导出,前者是本地名称( local name ),后者则是导出名称( exported name )。这意味着当另一个模块要导入此函数时,它必须改用 add 这个名称:

import { add } from "./example.js

导入默认值

你可以使用如下语法来从一个模块中导入默认值:

// 导入默认值
import sum from "./example.js";
console.log(sum(1, 2)); // 3

对于既导出了默认值、又导出了一个或更多非默认的绑定的模块,你可以使用单个语句来入它的所有导出绑定。例如,假设你有这么一个模块:

export let color = "red";
export default function(num1, num2) {return num1 + num2;
}

导入:

import sum, { color } from "./example.js";
console.log(sum(1, 2)); // 3
console.log(color); // "red"

绑定的再导出

export { sum } from "./example.js";

无绑定的导入

有些模块也许没有进行任何导出,相反只是修改全局作用域的对象。尽管这种模块的顶级变量、函数或类最终并不会自动被加入全局作用域,但这并不意味着该模块无法访问全局作用域。诸如Array与Object之类的内置对象的共享定义在模块内部是可访问的,并且对于这些对象的修改会反映到其他模块中。

例如,若你想为所有数组添加一个 pushAll() 方法,你可以像下面这样定义一个模块:

// 没有导出与导入的模块
Array.prototype.pushAll = function(items) {// items 必须是一个数组if (!Array.isArray(items)) {throw new TypeError("Argument must be an array.");}// 使用内置的 push() 与扩展运算符return this.push(...items);
};

这是一个有效的模块,尽管此处没有任何导出与导入。此代码可以作为模块或脚本来使用。由于它没有导出任何东西,你可以使用简化的导入语法来执行此模块的代码,而无须导入任何绑定:

import "./example.js";
let colors = ["red", "green", "blue"];
let items = [];
items.pushAll(colors);

ES6之用模块封装代码相关推荐

  1. python解析xml生成代码_python解析xml模块封装代码

    有如下的xml文件: 复制代码 代码如下: 1 2 下面介绍python解析xml文件的几种方法,使用python模块实现. 方式1,python模块实现自动遍历所有节点: 复制代码 代码如下: #! ...

  2. python解析xml文件选用模块_python解析xml模块封装代码

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  3. [译] 在 Google Apps 脚本中使用 ES6 和 npm 模块

    原文地址:Using ES6 and npm modules in Google Apps Script 原文作者:Prasanth Janardanan 译文出自:掘金翻译计划 本文永久链接:git ...

  4. 封装成vla函数_不知道怎么封装代码?看看这几种设计模式吧!

    为什么要封装代码? 我们经常听说:"写代码要有良好的封装,要高内聚,低耦合".那怎样才算良好的封装,我们为什么要封装呢?其实封装有这样几个好处: 封装好的代码,内部变量不会污染外部 ...

  5. 【ES6】Module模块详解

    [ES6]Module模块详解 一.Module的由来 二.严格模式 三.export命令 四.import命令 查看更多ES6教学文章: 参考文献 引言:由于两个JS文件之间相互使用必须通过一个ht ...

  6. 如何将自己写的verilog模块封装成IP核(二)

    =======================第一篇======================= 如何将自己写的verilog模块封装成IP核 将你的设计制作成BlackBox,也就是网表文件,这样 ...

  7. Magicodes.Pay,打造开箱即用的统一支付库,已提供ABP模块封装

    Magicodes.Pay,打造开箱即用的统一支付库,已提供ABP模块封装 简介 Magicodes.Pay,是心莱科技团队提供的统一支付库,相关库均使用.NET标准库编写,支持.NET Framew ...

  8. Java 9 揭秘(9. 打破模块封装)

    Tips 做一个终身学习的人. 在此章节中,主要介绍以下内容: 什么是打破模块的封装 如何使用命令行选项将依赖项(添加需要)添加到模块 如何使用--add-exports命令行选项导出模块的未导出包, ...

  9. jquery怎么判断不同的字显示不同的颜色_不知道怎么封装代码?看看这几种设计模式吧!...

    为什么要封装代码? 我们经常听说:"写代码要有良好的封装,要高内聚,低耦合".那怎样才算良好的封装,我们为什么要封装呢?其实封装有这样几个好处: 封装好的代码,内部变量不会污染外部 ...

最新文章

  1. 2、Get和post的区别
  2. 2020年行政区划代码_2020年梧州市行政区划,了解梧州市有几个区,详细数据
  3. 拓普微智能TFT液晶显示模块
  4. c++迭代器模式iterator
  5. PAT_B_1057_Java(20分)
  6. Erlang TCP Socket的接收进程的2种方案
  7. 电脑办公人员必看:效率翻倍的11个Excel技巧!
  8. java调用js查询mongo_mongodb操作之使用javaScript实现多表关联查询
  9. java jvm内存地址_JVM--Java内存区域
  10. 数据科学入门的5个技巧
  11. Unity字节序问题
  12. 命令以及查找帮助方法
  13. 【DockerCE】Docker-CE 20.10.17正式版发布
  14. mongoengine fields详解
  15. 重启explore(桌面进程)
  16. [ATPG]解读report_nonscan_cells -summary得到的report
  17. 第四十五讲:神州防火墙P2P流量控制配置
  18. 计算机总线详解(数据总线、地址总线、控制总线)
  19. 1个神经元 传两个神经元_硅神经元
  20. 404php模板,WordPress程序设置404.php模板

热门文章

  1. 单用户模式,忘记root密码
  2. 卸载Docker方法
  3. AD原理图复制 InvalidParameter Exception Occurred In Copy报错解决方法
  4. 3D坐标绕轴旋转公式推导
  5. 闭着眼睛也要会打的【数据的输入和输出有几道练习题】---- HDU1089-1096
  6. 情人节该送什么?超受欢迎的音质蓝牙耳机盘点!
  7. 32位MD5加密java实现工具类
  8. 达内CGB2110第二次java月考答案与解释
  9. Xsehll连接Linux进入VIm后不能鼠标右键复制
  10. Unity实战篇:实现连连看死局判定(二:具体实现)