/**
** Module
* 一个模块就是一个独立的文件 该文件内部的所有变量 外部无法获取
* ES6模块加载的机制 与CommonJS模块完全不同 CommonJS模块输出的是一个值的拷贝
而ES6模块输出的是值的引用
*/
let firstName = '小生爱';
let lastName = '小蓝';
let year = 1958;
// lz.js
// 输出3个变量
export {firstName, lastName, year};
// main.js
// 引入lz模块里的三个变量
import {firstName, lastName, year} from './lz';
let m = 1;
// 报错
export 1;
// 报错
export m;
// 正确 普通接口需要写在{}内
export {m};
// lz.js
// export输出接口 与其对应的值是动态绑定关系
// 即通过该接口 可以取到模块内部实时的值
export var foo = 'bar';
setTimeout( ()=>foo='baz', 500 );
// main.js
import {foo} from './lz';
c(foo);
// 500毫秒后foo的值为baz
setTimeout( ()=>c(foo), 500 );
// module.js
let foo = () => log(1)
foo()
// main.js
// 这么写会执行所加载的模块
// 多次加载相同模块只会执行一次
// 只是想引入某个模块 让这个模块自己运行 可以这么写
import './e.js'
// lz.js
export function area(radius) {
return Math.PI * radius * radius;
}
export function circumference(radius) {
return 2 * Math.PI * radius;
}
// main.js
// * as circle 加载所有export属性
import * as circle from './lz';
c( circle.area(4) );
c( circle.circumference(14) );
// lz.js
// default 导出默认变量名 一个模块只能有一个默认输出
// 使用default导出接口时 import不需要知道导出的具体接口名
export default function (num){
c(num);
};
// main.js
// import可以用任意名称指向lz.js输出的方法
// 变量名不能加{}
import func from './lz';
// 输出7
func(7);
// export default 命令输出一个叫 default的变量
// 所以它后面不能跟变量声明语句
// 报错
export default let a = 1
// lz.js
let foo = function (){
c('value');
};
// 添加了default的export后面foo函数的函数名foo
// 在模块外部是无效的 加载的时候 视同匿名函数加载
export default foo;
// main.js
// 随便定义一个变量名 不加{}
import func from './lz';
// 输出value
func();
// lz.js
export let counter = 3;
export function incCounter(){
counter++;
};
// main.js
// ES6模块不会缓存运行结果 而是动态地去被加载的模块取值 并且变量总是绑定其所在的模块
import {counter, incCounter} from './lz';
// 输出3
c(counter);
incCounter();
// 输出4
c(counter);
// lz.js
export let obj = {};
// main.js
import {obj} from './lz';
// 正常赋值 可以给obj添加属性
obj.name = '小生爱';
// 给obj重新赋值报错
// 由于ES6输入的模块变量 只是一个“符号连接”
// 所以这个变量是只读的 对它进行重新赋值会报错
obj = {};
// export default 命令输出一个叫 default的变量
// 所以它后面不能跟变量声明语句
// 报错
export default let a = 1