ES6异常和模块化
抛出异常
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();