继续模块化,这次是ES6

先说说ES6。

ECMA,也就是著名的国际标准化组织,javascript的创作者把javascript交给ECMA组织,希望javascript能成为国际标准,后来,ECMAScript的第一个版本应运而生。

ECMAScript经历了各种各样的版本,早在2011年就已经推出ECMAScript5.1版本,后来放弃版本号而使用年份来进行命名。在2015年推出了重要的ECMAScript2015版本,其中推出的新API为javascript提供了更加多样的功能,更多的可能性,向完整的编程语言更进一步,这就是ECMAScript6.0,但因为已经放弃了版本号,所以也用ES6来代表5.1版本以后的版本,也就是“下一代的javascript语言”。

(ES6虽然还没有被全部浏览器所实现,但因为ES6新功能的强大,很多从业者已经开始使用babel等转码工具把ES6的代码转成浏览器可以识别的ES5代码。)


ES6的一个强大之处是,统一了javascript的模块化标准,结束了以前只能使用require.js等库实现模块化的窘境,下面来看看它是如何实现的:

ES6模块的目标是尽量的在编译时就处理好模块之间的依赖问题,分析好输入和输出的变量,称为“编译时加载”。而CommonJS和AMD模式都是需要在代码运行的时候才能处理依赖,这叫做“运行时加载”。ES6在编译时已经处理好模块,所以比运行时建立对象,从对象中搜索属性的其他规范要高效,但同时暴露了它的弱点:ES6模块本身不是一个对象,我们不能引用其本身,或者说我们只是建立了一个对它的“连接”。

ES6模块使用严格模式编写(也就是默认使用 “use strict”)。

ES6模块主要功能由export和import两个部分组成:

一个模块就是一个文件,我们希望只有我们想要暴露的东西暴露出去,所以我们需要一个输出口。export就负责把模块内的属性或者方法输出,其他模块再通过import加载进来。

看一个例子:

//a.js
var name="wimenlo";
var height="180";
export {name,height};

//b.js
import {name,height} from "./a";
console.log("my name is"+name+"and i am"+height+"cm height");

例子中,a.js通过export输出了两个内部定义的变量,b.js则通过import输入了两个变量并使用。


export可以输出函数和变量,输出的内容需要的是一个接口,且该接口需要与模块里面的某个内容建立一一对应的关系:

export 1;

var m=1;
export m;

这两个写法都会引起报错,第一句直接输出1,并不是一个接口,第二句输出m,但m=1,所以还是直接输出1,也不是一个接口。

所以建议的写法是把所有输出接口用大括号括起来,写在模块尾部,能快速看出该模块输出的接口,函数也可以这么写。

export必须放在模块文件的顶层,放在块级作用于内的话会引起报错,因为“编译时加载”的关系,模块内部的函数并不会具体运行,所以输出无效。

同样使用import的时候因为是静态执行,所以下面的例子也会报错:

import {"f"+"oo"} from 'my_modules';

因为模块引用并没有具体的对象而是动态的绑定,所以在import取值的时候取到的是实时的值,也就是说模块内部发生的变化能通过接口显示出来(这跟其他规范不同)。


关于export default,默认输出

这个命令只输出一个匿名对象,(该对象可以有名字,也可以是匿名的,不过没有并不会对加载产生影响)在加载的时候再由加载语句命名:

//a.js
export default function(){
    //some code
}
//b.js
import foo from './a'


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值