From cef2b36a82edd9f4c16e7180d54e4dbb8094e037 Mon Sep 17 00:00:00 2001 From: ruanyf Date: Sun, 28 Jan 2018 09:24:08 +0800 Subject: [PATCH] =?UTF-8?q?docs(module):=20=E5=8A=A0=E5=85=A5=20import=20?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E7=9A=84=E5=8F=AA=E8=AF=BB=E6=80=A7=20#595?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/module.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/docs/module.md b/docs/module.md index 78d5ca2..ba8664c 100644 --- a/docs/module.md +++ b/docs/module.md @@ -6,7 +6,7 @@ 在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。 -ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。 +ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。 ```javascript // CommonJS模块 @@ -205,6 +205,24 @@ function setName(element) { import { lastName as surname } from './profile.js'; ``` +`import`命令输入的变量都是只读的,因为它的本质是输入接口。也就是说,不允许在加载模块的脚本里面,改写接口。 + +```javascript +import {a} from './xxx.js' + +a = {}; // Syntax Error : 'a' is read-only; +``` + +上面代码中,脚本加载了变量`a`,对其重新赋值就会报错,因为`a`是一个只读的接口。但是,如果`a`是一个对象,改写`a`的属性是允许的。 + +```javascript +import {a} from './xxx.js' + +a.foo = 'hello'; // 合法操作 +``` + +上面代码中,`a`的属性可以成功改写,并且其他模块也可以读到改写后的值。不过,这种写法很难查错,建议凡是输入的变量,都当作完全只读,轻易不要改变它的属性。 + `import`后面的`from`指定模块文件的位置,可以是相对路径,也可以是绝对路径,`.js`后缀可以省略。如果只是模块名,不带有路径,那么必须有配置文件,告诉 JavaScript 引擎该模块的位置。 ```javascript