文章目录
十四、es6内容14.1 数组API、正则API、字符串API14.2 模板字符串14.3 解构赋值14.3.1 对象的解构赋值14.3.2 函数参数的解构赋值14.3.3 补充:属性的简写
14.4 函数的扩展14.4.1 rest参数14.4.2 箭头函数
14.5 对象的扩展14.6 Promise14.6.1 回调地狱:14.6.2 Promise函数基本用法14.6.3 Promise函数实现多层回调14.6.4 Promise函数错误处理
14.7 async14.8 generator14.9 class14.9.1 定义一个类14.9.2 添加实例方法14.9.3 添加静态方法14.9.4 类的继承
14.10 module14.10.1 浏览器调试14.10.2 基本用法14.10.3 模块有多个导出14.10.4 模块导入导出取别名
十五、模块化15.1 非模块化的弊端15.2 基本实现:闭包的自调用函数15.3 AMD模块化 -->requireJS15.4 其他模块化解决方案:15.5 AMD和CMD的不同之处15.6 requireJS —— AMD规范15.6.1 基本用法15.6.2 入口文件15.6.3 配置15.6.4 定义模块的返回值(返回值相当于模块的入口)15.6.5 案例——模块依赖子模块15.6.7 检测第三方库是否支持AMD规范15.6.8 常用的模块、文件夹路径的配置15.6.9 插件15.6.10 requirejs解决循环依赖15.6.11 requirejs和vuejs浅显的比较15.6.12 node中的模块化15.6.13 前端路由的意义15.6.14 前端路由的实现方式
十四、es6内容
可参考阮一峰的ECMAScript 6 入门
14.1 数组API、正则API、字符串API
14.2 模板字符串
模板字符串的基本用法
var s1
= `abc`
模板字符串的优势:
var obj
={ name
:"",age
:5 };
var s1
="我叫:"+obj
.name
+",今年:"+obj
.age
+"岁。"
14.3 解构赋值
14.3.1 对象的解构赋值
var obj
={name
:"张三",age
:18}
var {name
,age
}=obj
;
var {name
:title
}=obj
;
14.3.2 函数参数的解构赋值
function f1(obj
){
console
.log(obj
.age
);
console
.log(obj
.height
)
}
function f1({ age
,height
}){
console
.log(age
);
console
.log(height
)
}
f1({age
:5,height
:180})
14.3.3 补充:属性的简写
var a
= 3 ;
var c
= 10;
var b
= { a
,c
} ;
console
.log(b
)
14.4 函数的扩展
14.4.1 rest参数
使用背景:es6的 优点:arguments是伪数组,而rest参数是真数组
function fn(...args
){
console
.log(args
);
}
fn(1,2,3,4,5)
14.4.2 箭头函数
场景:用于替换匿名函数 基本用法:
div
.onclick=function(){
console
.log("你好")
}
div
.onclick=()=>{
console
.log("你好")
}
有一个参数的箭头函数
var fn=(a
)=>{
console
.log("abc");
}
var fn=a
=>{
console
.log("abc");
}
有2个及更多参数的箭头函数
var f=(a
,b
,c
)=>{
console
.log("abc")
}
箭头函数和普通匿名函数有哪些不同?
函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。(不常用)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
generator函数现在经常用async替代
14.5 对象的扩展
Object.assign:实现拷贝继承对象扩展运算符
var obj1
={ age
:5,gender
:"男" }
var obj2
={ ...obj1
}
var obj3
={ ...obj1
, age
:10 }
14.6 Promise
为什么要有promise:解决回调地狱的问题
14.6.1 回调地狱:
$
.get("/getUser",function(res
){
$
.get("/getUserDetail",function(){
$
.get("/getCart",function(){
$
.get("/getBooks",function(){
})
})
})
})
14.6.2 Promise函数基本用法
var promise
=new Promise((resolve
,reject
)=>{
$
.get("/getUser",res
=>{
resolve(res
)
})
})
promise
.then(res
=>{
console
.log(res
);
})
14.6.3 Promise函数实现多层回调
new Promise((resolve
,reject
)=>{
$
.get("/getUser",res
=>{
resolve(res
)
})
}).then(res
=>{
return new Promise(resolve
=>{
$
.get("/getUserDetail",res
=>{
resolve(res
)
})
})
}).then(res
=>{
return new Promise(resolve
=>{
$
.get("/getCart",res
=>{
resolve(res
)
})
})
}).then(res
=>{
})
14.6.4 Promise函数错误处理
方式一
new Promise((resolve
,reject
)=>{
$
.ajax({
url
:"/getUser",
type
:"GET",
success
:res
=>{
resolve(res
);
},
error
:res
=>{
reject(res
)
}
})
}).then(resSuccess
=>{
},resError
=>{
})
方式二:
new Promise((resolve
,reject
)=>{
$
.ajax({
url
:"/getUser",
type
:"GET",
success
:res
=>{
resolve(res
);
},
error
:res
=>{
reject(res
)
}
})
}).then(resSuccess
=>{
}).catch(resError
=>{
})
14.7 async
async其实是一个promise的语法糖
async function get(){
console
.log('开始执行');
var res
= await timer()
console
.log('执行结束:',res
);
}
function timer(){
return new Promise((resolve
,reject
)=>{
setTimeout(()=>{
resolve("你好");
},1000)
})
}
get();
await可以执行异步操作,但是await必须在async函数内执行await操作可以有返回值,这个返回值表示promise操作成功的返回值如果await里面执行的异步操作发生了reject,或者发生了错误,那么只能使用try…catch语法来进行错误处理
14.8 generator
Generator是ES6的新特性,通过yield关键字,可以让函数的执行流挂起,那么便为改变执行流程提供了可能。
14.9 class
14.9.1 定义一个类
class Person {
constructor(name
) {
this.name
=name
;
}
}
function Person(name
){
this.name
=name
;
}
14.9.2 添加实例方法
class Person {
constructor(name
,age
) {
this.name
=name
;
this.age
=age
;
}
say() {
console
.log("大家好,我叫:"+this.name
+",今年:"+this.age
+"岁");
}
travel(){
console
.log("坐着飞机去巴厘岛");
}
}
14.9.3 添加静态方法
静态成员:静态属性、静态方法静态属性:通过类本身来访问:Person.maxAge静态方法:通过类本身来访问的一个方法:Person.born();
class Animal {
constructor(){
}
static born(){
console
.log("小呆萌出生了")
}
}
Animal
.born();
14.9.4 类的继承
class Person {
constructor(name
){
this.name
=name
;
}
}
class Student extends Person {
constructor(name
,grade
){
super(name
);
this.grade
=grade
;
}
}
[1,3,5].map(function(value
,index
){})
[1,3,5].map((value
,index
)=>{})
14.10 module
14.10.1 浏览器调试
本地调试,会受浏览器同源策略的影响,需要开启web服务才能打开
<script type
="module">
</script
>
14.10.2 基本用法
导出模块:
export default { name
:"abc" }
导入模块:(
import common
from "common.js"
console
.log( common
.name
)
14.10.3 模块有多个导出
export const jim
= { country
:"France" }
export const tony
= { color
:"gray" }
export default { name
:"abc" }
import person
, { jim
, tony
} from "person.js"
14.10.4 模块导入导出取别名
export const tony
= { color
:"gray" }
export { tony
as Tony
}
import { Tony
} from "person.js"
import { Tony
as man
} from "person.js"
console
.log(man
)
十五、模块化
15.1 非模块化的弊端
代码杂乱无章,没有条理性,不便于维护,不便于复用很多代码重复、逻辑重复全局变量污染不方便保护私有数据(闭包)
15.2 基本实现:闭包的自调用函数
var DatePicker
= (function(){
return {
init(){}
}
})();
var KTV=(function(){
return {
pay(){},
xiaofei(){}
}
})()
15.3 AMD模块化 -->requireJS
AMD:async module define:异步模块定义AMD其实就是requireJS实现的模块化解决方案
15.4 其他模块化解决方案:
CommonJS:Node中使用的模块化解决方案CMD(common module define):seajs中提出来的模块化解决方案
其实CMD可以认为是CommonJS的前端实现seajs由阿里的(玉帛)编写seajs在2,3年前比较火,从去年开始已经停止更新
vue 、angular、react已经集成了各自的模块化es6模块化webpack也有模块化的解决方案
15.5 AMD和CMD的不同之处
amd需要依赖前置,cmd需要依赖就近导入导出方式不同:
amd通过define定义,return导出;cmd通过不需要定义,只需要最后通过module.exports、exports导出
15.6 requireJS —— AMD规范
requireJS中文网
15.6.1 基本用法
//1、通过script标签导入requirejs源文件
//2、编写模块文件,基本格式如下:
//home.js
define([],function(){
console.log('home模块');
})
//user.js
define([],function(){
console.log('user模块');
})
//3、首页调用模块:
require(["home","product.js"],function(){ })
15.6.2 入口文件
15.6.3 配置
require
.config({
baseUrl
:'js',
paths
:{
'jquery':'jquery.min.js',
}
})
15.6.4 定义模块的返回值(返回值相当于模块的入口)
define([],function(){
return {
init(){},
addUser(){}
}
})
require(["cart"],function(cart
){
cart
.init();
cart
.addUser();
})
注意:一般在导入模块的时候,需要将有返回值的模块在[前面]导入,无返回值的模块在[后面]导入
15.6.5 案例——模块依赖子模块
define([],function(){
return {
init(){
console
.log("添加用户");
}
}
})
define([],function(){
return {
init(){
console
.log("编辑用户");
}
}
})
return {
init(){
console
.log("用户初始化");
},
add(){
userAdd
.init();
},
edit(){
userEdit
.init();
}
}
})
require(["user"],function(user
){
user
.init();
user
.add();
user
.edit();
})
15.6.7 检测第三方库是否支持AMD规范
if ( typeof define
=== "function" && define
.amd
) {
define([], function() {
return jQuery
;
} );
}
类似的还有:echarts
15.6.8 常用的模块、文件夹路径的配置
一般用于配置第三方模块,比如jquery、bootstrap、zepto等等
require
.config(
paths
:{
jquery
:"js/lib/jquery-1.11.min",
zepto
:"js/lib/zepto.min",
bootstrap
:"assets/bootstrap/js/bootstrap.min"
}
)
define(["jquery","zepto"],function($
,$$
){})
require(["jquery","bootstrap"],function($
){})
15.6.9 插件
插件列表:https://github.com/requirejs/requirejs/wiki/Pluginsi18n 国际化text 加载文件(.html文件。。。)
插件github地址:https://github.com/requirejs/text
15.6.10 requirejs解决循环依赖
a已经依赖了bb中先添加require模块的依赖,然后再添加a的依赖,但是并不要去通过回调函数的形参获取返回值
define(["require","a"],function(require){})在需要执行a模块代码的时候,require("a")()
15.6.11 requirejs和vuejs浅显的比较
requirejs是一个库
功能:只是一种模块化的解决方案 vue是一个框架 功能:
1、不仅仅是模块化的解决方案2、减少了DOM的操作(–>jquery的功能)
15.6.12 node中的模块化
require(“http”).createServer()require(“fs”).readFile()require(“common/type”).doSth()
15.6.13 前端路由的意义
1、通过路由将各个功能从url上面就分辨出来了
/user/list/user/3/user/edit/3 2、路由还可以进行前进、后退等导航操作
15.6.14 前端路由的实现方式
1、监听window对象的hashchange事件
hash值:通过location.hash获取,获取的值以#开头也可以通过location.hash来设置hash值,当然设置的新hash也应该以#开头 2、history对象:popState/pushState