ECMAScript6系列之八:函数的扩展

栏目: JavaScript · 发布时间: 7年前

内容简介:ECMAScript6系列之八:函数的扩展

一、函数参数的默认值

1.基本用法:

ES6允许为函数的参数设置默认值,即直接写在参数定义的后面;

两个好处:一是有利于将来代码优化;二是可以立刻意识到哪些参数是可以省略的;

设置了默认值的参数不能在函数体中用let或const再次声明;

使用参数默认值时,函数不能有同名参数;

如果参数默认值是变量,那么参数就不是传值的,而是每次都重新计算默认表达式的值;

ECMAScript6系列之八:函数的扩展

2.与解构赋值默认值结合使用

ECMAScript6系列之八:函数的扩展

注意以下两种写法的差别:

ECMAScript6系列之八:函数的扩展

ECMAScript6系列之八:函数的扩展

区别是:写法一函数参数的默认值是一个空对象,但是设置了对象解构赋值的默认值;写法二函数参数的默认值是一个有具体属性的对象,但是没有设置对象解构赋值的默认值;

3.参数默认值的位置

通常,定义了默认值的参数应该是函数的尾参数,因为比较容易看出省略了哪些参数;前面的参数不可以省略,设置了默认值的参数可省略;

当默认值的参数不是尾参数时,这时无法只省略该参数而不省略它后面的参数,除非显示输入undefined使默认值生效;

4.函数的length属性

指定了默认值以后,函数的length属性将返回没有指定默认值的参数的个数;也就是说指定了默认值后,length属性将失真;

如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了;

ECMAScript6系列之八:函数的扩展

5.作用域

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域,等到初始化结束,这个作用域就会消失;

ECMAScript6系列之八:函数的扩展

ECMAScript6系列之八:函数的扩展

如果参数的默认值是一个函数,该函数的作用域也遵守这个规则;

ECMAScript6系列之八:函数的扩展

二、rest参数

ES6引入了rest参数(形式为“...变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了;

rest参数之后不能再有其他参数,否则报错;

函数的length属性,不包括rest参数;

三、扩展运算符

1.含义

将一个数组转为逗号分隔的参数序列;

2.替代数组的apply方法

ECMAScript6系列之八:函数的扩展

ECMAScript6系列之八:函数的扩展

3.扩展运算符的应用

——合并数组:[ ...arr1, ...arr2, ...arr3 ]

——与解构赋值结合:

ECMAScript6系列之八:函数的扩展

——函数的返回值:函数只能返回一个值,如需要返回多个值,只能返回数组或对象,扩展运算符提供了解决这个问题的一种变通方法;

——字符串:可以将字符串转为真正的数组;

——实现了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.尾调用优化

即只保留内层函数的调用帧,这样大大节省内存,这就是尾调用优化的意义;

注意:只有不再用到外层函数的内部变量,内层函数的调用帧才会取代外层函数的调用帧,否则就无法进行“尾调用优化”;如:

ECMAScript6系列之八:函数的扩展

2.尾递归

函数调用自身,称为递归。如果尾调用自身,就称为尾递归;

递归非常消耗内存,因为同时保存成千上百个调用帧,很容易发生“栈溢出”错误,但对于尾调用来说,由于只存在一个调用帧,所以永远不会发生“栈溢出”;

3.递归函数的改写

尾递归的实现往往需要改写递归函数,确保最后一步只调用自身,做到这一点,就是把所有用到的内部变量改写成函数的参数;

4.严格模式

尾调用优化只在严格模式下开启,正常模式下是无效的;

这是因为正常模式下,函数内部有两个变量,可以跟踪函数的调用栈:func.arguments、func.caller

5.尾递归优化的实现

正常模式下如何实现尾递归优化呢,采用“循环”换掉“递归”;

ECMAScript6系列之八:函数的扩展

九、函数参数的尾逗号

此前,函数定义和调用时,都不允许最后一个参数后面出现逗号;

ES7允许函数的最后一个参数后面有尾逗号;

只是为了统一和方便;


以上所述就是小编给大家介绍的《ECMAScript6系列之八:函数的扩展》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java语言精粹

Java语言精粹

Jim Waldo / 王江平 / 电子工业出版社 / 2011-6 / 39.00元

这是一本几乎只讲java优点的书。 Jim Waldo先生是原sun微系统公司实验室的杰出工程师,他亲历并参与了java从技术萌生、发展到崛起的整个过程。在这《java语言精粹》里,jim总结了他所认为的java语言及其环境的诸多精良部分,包括:类型系统、异常处理、包机制、垃圾回收、java虚拟机、javadoc、集合、远程方法调用和并发机制。另外,他还从开发者的角度分析了在java技术周围......一起来看看 《Java语言精粹》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换