抛出异常

Js的异常语法和ava相同,使用throw关键字抛出,
使用throw关键字可以拋出任意对象的昇常

throw new Error('new error');
throw new ReferenceError('Ref Error') ;
throw 1;
throw 'not ok':
throw [1,2,3];
throw {'a':1};
throw ()=>{}; //函数

捕获异常

try...catch 语句捕获异常.
try..catch...finally 语句捕获异常,finally保证最终一定执行。
注意这里的catch不支持类型,也就是说至多一个catch语句。可以在catch的语句块内,自行处理异常。

try {
    // throw new Error('new error');
    // throw new ReferenceError ('Ref Error');
    // throw 1;
    // throw new Number (100) ;
    // throw 'not ok;
    // throw 1.2.31:
    // throw f'a':1};
    throw () => {};  // 函数
} catch (error) {
    console.log(typeof(error));
    console.log(error.constructor.name);
} finally {
    console. log('===end===)
}

模块化

ES6之前,JS没有出现模块化系统。
Js主要在前端的浏览器中使用,js文件下载缓存到客户端,在浏览器中执行。
比如简单的表单本地验证,漂浮一个广告。
服务器端使用ASP、JSP等动态网页技术 ,将动态生成数据嵌入一个HTML模板,里面夹杂着JS后使用<script>标签,返回浏览器端。
这时候的JS只是一些简单函数和语句的组合。

2005年之后,随着Google大量使用了AJAX技术之后,可以异步请求服务器端数据,带来了前端交互的巨大变化。
前端功能需求越来越多,代码也越来也多。随着js文件的增多,灾难性的后果产生了。由于习惯了随便写,js脚本
中中各种全局变量污染,函数名冲突,无法表达脚本之问的依赖关系 ,因为都是用脚本文件先后加载来实现的。亟待
模块化的出现.

2008年V8引擎发布,2009年诞生了Nodejs,支持服务端S编程,但没有模块化是不可以的。
之后产生了commonjs规范。
commonjs规范,使用全局require函数导入模块,使用exports导出变量,
为了将这种模块化规范向前端开发迁移,又演化出其它的规范。例如AMD。

AMD ( Asynchronous Module Definition )异步模块定义,使用异步方式加载模块 ,模块的加载不影响它后面语
句的执行。所有依赖这个模块的语句,都需要定义在一个回调西数,回调西数中使用模块的变量和西数,等模块加
载完成之后,这个回调西数才会执行,就可以安全的使用模块的资源了。其实现就是AMD/Requirejs。AMD量然是
异步,但是会预先加载和执行。

CMD ( Common Module Definition), 使用seais, 作者是淘宝前端玉伯,兼容并包解決了Requirels的问题
CMD推崇as lazy as possible, 尽可能的懒加载。

由于社区的模块化呼声很高,ES6开始提供支持模块的语法,但是浏览器目前支持还不够。

ES6模块化

import语句,导入另一个模块导出的绑定
expor语句,从模块中导出西数、对象、值的,供其它模块import导入用。

导出

建立一个模块目录srC,然后在这个目录下新建一个modajs,内容如下

// 缺省导出
export default class A {
    constructor(x){
        this.x = x;
    }
    show() {
        console.log(this.x);
    }
}

// 导出函数
export function foo) {
    console.log('foo function');
}

// 导出常量
export const CONSTA = 'aaa':

导入

其它模块中导入语句如下

import { A, foo } from "./src/moda";
import * as mod_a from "./src/moda";

缺省导入导出

只允许一个缺省导出,缺省导出可以是变量、函数、类,但不能使用let、var、const关键字作为默认导出

// 缺省导出 匿名函数
export default function() {
console.log('default export function' )

// 缺省导入
import defaultFunc from './mod'
defaultFunc();
// 缺省导出 命名函数
export default function xyz(){
    console.log('default export function')
}
// 缺省导入
import defaultFunc from './mod'
defaultFunc();

缺省导入的时候,可以自己重新命名,不需要和缺省导出时一致。
缺省导入,不需要在import后使用花括号,

命名导入导出

/**
* 导出举例
*/
// 缺省导出类
export default class {
constructor(x){
    this.x = X;
    show(){
        console.log(this.x);
    }
}

// 命名导出 函数
export function foo) {
    console.10g('regular foo()');
}
// 函数定义
function bar() {
    console.log ('regular bar() ');
}
// 变量常量定义
let x = 100;
var y = 200;
const z = 300 ;
// 导出
export {bar, x, y, z};

/**
 * 导入举例
 * as 设置别名
 */
import defaultels, (foo, bar, x, y, z as CONST_C} from './mod'

foo();
bar();
console.1og(x); //x只读,不可修改,x++异常
console.log(y); //y只读
console. log(CONST_C);

new defaultCls(1000).show();

也可以使用下面的形式,导入所有导出,但是会定义一个新的名词空间。使用名词空间可以避免冲突,

import * as newmod from "./mod':

newmod.foo();
newmod.bar) :
new newmod.default (2000).show();