浏览器会按照模块的处理方式来加载这份 js 文件,与模块脚本的处理方式与正常 js 脚本文件处理方式最不同的地方在于,模块内的代码都是在模块作用域中执行,也就是在模块 js 文件中的全局变量这些并不会被添加到全局对象的属性中,其他 js 文件无法访问。
那么,其他 js 文件如何使用这份模块 js 文件呢?
有三点要求:
模块 js 文件内,需要通过 export 声明该模块对外开放的接口
当前 js 文件内,需要通过 import 来引入模块对外开放的接口,想使用哪些接口,就需要引入哪些
当前 js 也必须是模块脚本文件,即 type=module 才行
import 命令和 export 命令是模块机制的关键,但只两个命令只能在 type=module 的 js 文件内生效,如果某个 js 文件声明了 type=text/javascript,然后代码里又使用到 import 或 export,那么运行期间会报错。
对外提供功能的模块
//module.js //... //以上省略模块内部功能代码 //一般对外的接口可放在文件底部,方便一览无余 //第一种: export var name = "dasu"; export function getName() {return "dasuAndroidTv"}; //第二种: var name = "dasu" var getName = function() {return "dasuAndroidTv"}; export {name, getName}使用其他模块功能的当前脚本
//第一种:from后跟js的相对路径或绝对路径 import {name, getName} from 'module.js' //第二种: import * as Module from 'module.js' //使用 Module.name; Module.getName(); //...最后,记住,模块脚本文件中,自动以严格模式运行,限制也很多,更多用法、细节说明参考:
变量解构ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
以前,为变量赋值,只能直接指定值。
var a = 1; var b = 2; var c = 3;ES6 允许写成下面这样。
var [a, b, c] = [1, 2, 3];上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。
本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。
这种特性可以带来很多便捷:
函数可以返回多个值
// 返回一个数组 function example() { return [1, 2, 3]; } let [a, b, c] = example(); // 返回一个对象 function example() { return { foo: 1, bar: 2 }; } let { foo, bar } = example();对象取值时很方便
//解析服务端返回的数据对象,提取其中的各字段值 var o = { code: 1, msg: "success", content: {...} }; var {code, msg, content} = o;解构时,还可以设置默认值,更多用法,参考:
字符串的扩展ES6 中对字符串的处理扩展了很多新特性,让字符串的处理更加强大,下面看一个很强大的特性:
模板字符串传统的 JavaScript 语言,输出模板通常是这样写的(下面使用了 jQuery 的方法)。
$('#result').append( 'There are <b>' + basket.count + '</b> ' + 'items in your basket, ' + '<em>' + basket.onSale + '</em> are on sale!' );上面这种写法相当繁琐不方便,ES6 引入了模板字符串解决这个问题。
$('#result').append(` There are <b>${basket.count}</b> items in your basket, <em>${basket.onSale}</em> are on sale! `);模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
更多字符串扩展的特性介绍参见:
函数的扩展ES6 中,对于函数的处理也增加了很多新特性,让函数变得更强大。
参数默认值ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法。
function log(x, y) { x = x || 'dasu'; y = y || 'Android'; console.log(x, y); }ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。
function log(x="dasu", y="Android") { console.log(x, y); }当然,参数默认值还有更多细节,比如默认参数的作用域是单独的、有默认参数值的函数 length 属性含义会变化等等。
剩余参数 resetES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; } add(2, 5, 3) // 10 箭头函数ES6 允许使用“箭头”(=>)定义函数。
var f = v => v; // 等同于 var f = function (v) { return v; };箭头前面是参数,后面的函数体,如果超过 1 个参数,那么用圆括号将多个参数圈起,如果没有参数,就用一个空圆括号 () 表示,如果函数体超过 1 行语句,那么用 {} 大括号包住。
var f = () => 5; // 等同于 var f = function () { return 5 }; var sum = (num1, num2) => num1 + num2; // 等同于 var sum = function(num1, num2) { return num1 + num2; };当函数作为另一个函数的参数时,箭头函数的写法会让代码变得很便捷,如:
箭头函数的一个用处是简化回调函数。
// 正常函数写法 [1,2,3].map(function (x) { return x * x; }); // 箭头函数写法 [1,2,3].map(x => x * x);嵌套的箭头函数