小生爱

   
        /**
            **   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