函数的扩展
函数参数设置默认值
...rest参数
箭头函数
Promise函数
Generator 函数
async函数
11.函数的扩展
(1)函数参数的设置
函数参数的默认值:
例如 function myfun(x,y=0){},设置默认值的参数会变成必穿参数,不传会报错;
undefined,将触发该参数等于默认值,null则没有这个效果
函数的length属性,将返回没有指定默认值的参数个数,设置默认值后不会计入长度之内,扩展参数也不在len里面
rest 参数:
(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了,就是对象的扩展运算符;
rest 参数之后不能再有其他参数
函数的length属性,不包括 rest 参数。
只要函数参数使用了默认值、解构赋值、或者扩展运算符,那么函数内部就不能显式设定为严格模式,否则会报错
(2)箭头函数
var f = v => v;
var f = () => 5;
var sum = (num1, num2) => num1 + num2;
let getTempItem = id => ({ id: id, name: "Temp" });
let fn = () => void doesNotReturn(); //没有返回值,只有一行语句
注意:
箭头函数没有自己的this对象。
不可以当作构造函数,也就是说,不可以对箭头函数使用new命令,否则会抛出一个错误。
不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
(3)Promise函数
loopEvent事件循环:执行栈,异步对列,执行对列;
js程序执行代码在执行栈中,此时都是同步在执行,但在运行代码时如果遇见事件绑定、计时器会将抛到异步任务队列里面等待js引擎执行,然后继续执行在执行栈中的代码,于此同时,被抛到异步执行队列里面的计时器会执行等待的时间,如果等待时间结束,则会将此事件抛到执行队列里面。执行栈里面的代码执行完成后,程序会去检查执行队列里面是否有事件,如果有,则拿出来执行。如果没有,则会一直循环检查,直到异步事件队列和执行队列里面都没有才结束程序
同步:任务按列队顺序执行
异步,任务进入执行状态后及进入下一个任务
回掉地狱:数据依赖于接口返回,多次嵌套网络请求
定义promise函数
1,定义函数,返回一个promise对象;例如:function getDetail(){new Promise((resolve,reject)=>{ api().then(resolve(res)) })};
2.函数使用,getDetail().then(res=>{. //拿到值了 })
promist:内部抛出数据请求成功失败结果,使用.then()调用解决回掉地狱;
promise.race(fun1(),fun2()):返回回掉相对快的结果
promise.all(fun1(),fun2()):返回所有结果为各自promise函数的回掉结果组成的数组
Promise.then().catch()
promise的缺点:
(1)只有定义了promise实例,中途不能停止
(2)除非使用回掉,不会自动抛出错误
(3)当处于 Pending 状态时,无法得知目前进展到哪一个阶段
(3)Generator 函数
generator函数与普通函数区别
1.普通函数:一旦开始执行,就会运行到最后,或是遇到return返回,不会有其他代码打断
2.generator函数:
定义语法:function* myfun(){ yield...}; (推荐紧挨着function关键字,可以有多个yield)
调用:let generator=myfun()直接调用函数返回一个遍历器对象(Iterator Object);使用generator.next()方法,遍历 Generator函数内部的每一个状态
(4)async函数
就是将 Generator 函数的星号(*)替换成async,将yield替换成await;是Generator函数的优化提升;主要表现一下几点:
1.内置执行器。可以直接进行,不用使用.next()调用
2.yield命令后面只能是 Thunk 函数或 Promise 对象,而async函数的await命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)。
语法:async function myfun(){ ...await... }
调用:myfun()
备注:
async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。
async 函数中可能会有 await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触 发的异步操作完成后,恢复 async 函数的执行并返回解析值。
await 关键字仅在 async function 中有效。否则会报错,后面跟一个promise对象;
Async函数属于异步函数,代码执行会放在异步任务队列
网友评论