Skip to content

Commit cef2b36

Browse files
committed
docs(module): 加入 import 命令的只读性 ruanyf#595
1 parent b2a2c58 commit cef2b36

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

docs/module.md

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。
88

9-
ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。
9+
ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。
1010

1111
```javascript
1212
// CommonJS模块
@@ -205,6 +205,24 @@ function setName(element) {
205205
import { lastName as surname } from './profile.js';
206206
```
207207

208+
`import`命令输入的变量都是只读的,因为它的本质是输入接口。也就是说,不允许在加载模块的脚本里面,改写接口。
209+
210+
```javascript
211+
import {a} from './xxx.js'
212+
213+
a = {}; // Syntax Error : 'a' is read-only;
214+
```
215+
216+
上面代码中,脚本加载了变量`a`,对其重新赋值就会报错,因为`a`是一个只读的接口。但是,如果`a`是一个对象,改写`a`的属性是允许的。
217+
218+
```javascript
219+
import {a} from './xxx.js'
220+
221+
a.foo = 'hello'; // 合法操作
222+
```
223+
224+
上面代码中,`a`的属性可以成功改写,并且其他模块也可以读到改写后的值。不过,这种写法很难查错,建议凡是输入的变量,都当作完全只读,轻易不要改变它的属性。
225+
208226
`import`后面的`from`指定模块文件的位置,可以是相对路径,也可以是绝对路径,`.js`后缀可以省略。如果只是模块名,不带有路径,那么必须有配置文件,告诉 JavaScript 引擎该模块的位置。
209227

210228
```javascript

0 commit comments

Comments
 (0)