ECMAScript6系列之八:函数的扩展
栏目: JavaScript · 发布时间: 7年前
内容简介:ECMAScript6系列之八:函数的扩展
一、函数参数的默认值
1.基本用法:
ES6允许为函数的参数设置默认值,即直接写在参数定义的后面;
两个好处:一是有利于将来代码优化;二是可以立刻意识到哪些参数是可以省略的;
设置了默认值的参数不能在函数体中用let或const再次声明;
使用参数默认值时,函数不能有同名参数;
如果参数默认值是变量,那么参数就不是传值的,而是每次都重新计算默认表达式的值;
2.与解构赋值默认值结合使用
注意以下两种写法的差别:
区别是:写法一函数参数的默认值是一个空对象,但是设置了对象解构赋值的默认值;写法二函数参数的默认值是一个有具体属性的对象,但是没有设置对象解构赋值的默认值;
3.参数默认值的位置
通常,定义了默认值的参数应该是函数的尾参数,因为比较容易看出省略了哪些参数;前面的参数不可以省略,设置了默认值的参数可省略;
当默认值的参数不是尾参数时,这时无法只省略该参数而不省略它后面的参数,除非显示输入undefined使默认值生效;
4.函数的length属性
指定了默认值以后,函数的length属性将返回没有指定默认值的参数的个数;也就是说指定了默认值后,length属性将失真;
如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了;
5.作用域
一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域,等到初始化结束,这个作用域就会消失;
如果参数的默认值是一个函数,该函数的作用域也遵守这个规则;
二、rest参数
ES6引入了rest参数(形式为“...变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了;
rest参数之后不能再有其他参数,否则报错;
函数的length属性,不包括rest参数;
三、扩展运算符
1.含义
将一个数组转为逗号分隔的参数序列;
2.替代数组的apply方法
3.扩展运算符的应用
——合并数组:[ ...arr1, ...arr2, ...arr3 ]
——与解构赋值结合:
——函数的返回值:函数只能返回一个值,如需要返回多个值,只能返回数组或对象,扩展运算符提供了解决这个问题的一种变通方法;
——字符串:可以将字符串转为真正的数组;
——实现了Iterator接口的对象:任何Iterator接口的对象,都可以用扩展运算符转为真正的数组;类数组没有部署Iterator接口,扩展运算符会报错,这时可以改用Array.from方法将类数组转为真正的数组;
——Map和Set结构,Generator函数:扩展运算符都可以将其转换为数组;
四、严格模式
ES5函数内部可以设定为严格模式;
ES6规定,只要函数参数使用了默认值、解构赋值、扩展运算符,那么函数内部就不能显式设定为严格模式,否则报错;
规避的两种方法:设定全局性的严格模式;把函数包在一个无参数的立即执行函数里;
五、name属性
返回该函数的函数名;
如果将有个匿名函数赋值给一个变量,ES5name属性返回空字符串,ES6返回实际的函数名;
Function构造函数name属性值为anonymous;
bind返回的函数的name属性值会加上bound前缀;
六、箭头函数
1.基本用法
如果箭头函数的代码块部分多于一条语句,就使用大括号括起来,并用return语句返回;
由于大括号被解释为代码块,如果箭头函数返回的是对象,必须在对象外加上大括号;
箭头函数可以和变量解构赋值结合使用;
2.注意点
——函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象(this指向固定化);
——不可以当做构造函数,即不可以使用new命令,否则报错;
——不可以使用arguments对象,该对象在函数体内不存在,如果要用,使用Rest参数代替;
——不可以使用yield命令,因此箭头函数不能用作Generator函数;
箭头函数没有自己的this,而是引用外层的this;
3.嵌套的箭头函数
七、绑定this
箭头函数可以绑定this对象,大大减少了显式绑定this对象的写法;但是,箭头函数并不适用于所有场合,所以ES7提供了函数绑定运算符(::);
双冒号左边是一个对象,右边是一个函数,会自动将左边的对象作为上下文环境(即this),绑定到右边的函数上面;
八、尾调用优化
就是指某个函数的最后一步是调用另一个函数;尾调用不一定出现在函数尾部,只要是最后一步操作即可;
1.尾调用优化
即只保留内层函数的调用帧,这样大大节省内存,这就是尾调用优化的意义;
注意:只有不再用到外层函数的内部变量,内层函数的调用帧才会取代外层函数的调用帧,否则就无法进行“尾调用优化”;如:
2.尾递归
函数调用自身,称为递归。如果尾调用自身,就称为尾递归;
递归非常消耗内存,因为同时保存成千上百个调用帧,很容易发生“栈溢出”错误,但对于尾调用来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”;
3.递归函数的改写
尾递归的实现往往需要改写递归函数,确保最后一步只调用自身,做到这一点,就是把所有用到的内部变量改写成函数的参数;
4.严格模式
尾调用优化只在严格模式下开启,正常模式下是无效的;
这是因为正常模式下,函数内部有两个变量,可以跟踪函数的调用栈:func.arguments、func.caller
5.尾递归优化的实现
正常模式下如何实现尾递归优化呢,采用“循环”换掉“递归”;
九、函数参数的尾逗号
此前,函数定义和调用时,都不允许最后一个参数后面出现逗号;
ES7允许函数的最后一个参数后面有尾逗号;
只是为了统一和方便;
以上所述就是小编给大家介绍的《ECMAScript6系列之八:函数的扩展》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- HIVE自定义函数的扩展
- 通读ES6--函数的扩展
- 如何扩展AngularJS资源($资源)的构造函数?
- ECMAScript 6 学习笔记(六):函数的扩展
- 写扩展性好的代码:函数
- ES6入门之函数的扩展
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java语言精粹
Jim Waldo / 王江平 / 电子工业出版社 / 2011-6 / 39.00元
这是一本几乎只讲java优点的书。 Jim Waldo先生是原sun微系统公司实验室的杰出工程师,他亲历并参与了java从技术萌生、发展到崛起的整个过程。在这《java语言精粹》里,jim总结了他所认为的java语言及其环境的诸多精良部分,包括:类型系统、异常处理、包机制、垃圾回收、java虚拟机、javadoc、集合、远程方法调用和并发机制。另外,他还从开发者的角度分析了在java技术周围......一起来看看 《Java语言精粹》 这本书的介绍吧!