专栏首页coding个人笔记ES6之函数的扩展

ES6之函数的扩展

ES6对函数的扩展函数蛮多的,不过常用的估计也就是默认值和箭头函数了。

函数参数默认值:

估计很多人都这样用过默认值:

var a = 10;
var b = a || 1

正常情况下没有问题,但是要是a是0或者是false等会被转换成Boolean类型false的时候就会出错。ES6对参数的默认值允许直接设置:

function fn(x = 10, y = 20) { 
  console.log(x); 
  console.log(y);
}
fn()// 10 20

参数默认值相当于你考虑了没有参数的情况,没有参数也不会报错。要注意的是参数变量不能用let或者const再次声明,不允许同名。参数默认值位置是不能跳过的,想要跳过默认想要传undefined,null无效。还有一点,没有默传参情况下才会赋值:

function fn(x = (function () { 
  console.log('执行');
})(), y = 20) {
}
fn()//执行fn(10)

参数默认值和解构赋值配合使用:

function fn({x = 10, y = 20} = {}) { 
  console.log(x); 
  console.log(y);
}
fn()//10 20
fn({x: 30, y: 40})//30 40

Length属性:

简单说就是参数个数:

function fn(a, b, c) {}
console.log(fn.length);//3

有默认值的时候,这个length只会计算最后面有默认值之前的参数个数:

function fn(a = 0, b, c) {}
console.log(fn.length);//0
function fn(a, b = 0, c) {}
console.log(fn.length);//1
function fn(a, b, c = 0) {}
console.log(fn.length);//2
function fn(a = 0, b = 0, c) {}
console.log(fn.length);//0

函数参数作用域:

设置函数参数默认值的时候,参数会形成一个单独的作用域,初始化接收作用域消失。注意,只有设置默认值的时候才会。

var a = 1;function fn(a, b = a) { 
  console.log(a);
}
fn(10)//10

形成一个作用域,b指向了参数里面的a

var a = 1;
function fn(b = a) { 
  var a = 10; 
  console.log(b);
}
fn()//1

形成作用域,a没有找到就向外寻找,找到全局的a。

Rest参数:

函数有一个arguments参数,我们可以用数组的方法去获取内容,但是arguments不是数组,用不了数组的方法。Rest参数其实就是用扩展运算符把参数变成一个数组:

function fn(...val) { 
 console.log(val);
}
fn(1, 2, 3)//[1, 2, 3]

严格模式:

ES5之后可以函数内部使用严格模式,ES6只要使用了默认值、解构赋值、或者扩展运算符就不能使用

function fn() { 
  'use strict'
}

Name属性:

ES6对name有一些调整,优先函数名字,其次函数变量的名字,Function构造函数会返回anonymous,通过bind改变this的会加bound

function fn() {}
console.log(fn.name);//fn
var fn = function () {}
console.log(fn.name);//fn
var fn = function ffn() {}
console.log(fn.name);//ffn
console.log((new Function).name);//anonymous
function fn() {}
console.log(fn.bind({}).name);//bound fn

箭头函数:

这应该不用多说了,现在几乎都使用箭头函数,之前也有分享过箭头函数的一些内容。

双冒号运算符:

双冒号左边是一个对象,右边是一个函数。该运算符会自动将左边的对象,作为上下文环境(即this对象),绑定到右边的函数上面。这好像目前是一个提案,我试着写了写,运行报错。

尾调用优化:

尾调用是被忽略的,所以单独分享了一篇尾调用优化的,可以查看。

函数参数尾逗号:

我们函数不管是调用还是定义的时候,都不会在参数最后面加个逗号,ES2017才开始允许加逗号不报错:

function fn(a, b,) { 
  console.log(a); 
  console.log(b);
}
fn(10, 20,)

(完)

本文分享自微信公众号 - coding个人笔记(gh_2ce38b49dae1),作者:wade

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Async/await

    JavaScript的异步一直是JavaScript的一个复杂的事,从回调到Promise再到Generator,直到async/await,都是为了解决异步操...

    wade
  • HTTP之TCP三次握手及四次挥手

    TCP协议应该所有开发人员都听过,至于有没有搞清楚就不知道了。今天分享一下自己理解的思路。

    wade
  • call、apply、bind

    刚开始写技术笔记的时候,很浅显的写了一篇this的指向问题,现在看起来不能说错误百出,但也确实是没什么技术水平。今天分享自己对于call、apply、bind新...

    wade
  • js中匿名函数自调用

    * 全称: Immediately-Invoked Function Expression 立即调用函数表达式

    李才哥
  • 3、你能读得懂的TypeScript教程之函数

    如果你指定了返回类型为void,却偏偏要返回值,那是在找死,一样不会编译通过,如:

    用户1272076
  • 日本人眼中的中国制造企业:聪明反被聪明误

    事实上,中国离强国还有很远很远很远的路要走,要想成为真正的经济强国,不能依靠炒房地产、炒金融、吹IT泡沫,还需要向日本学习务实精神,通过脚踏实地、培养扎实的实业...

    华章科技
  • NLTK相关知识介绍

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    村雨遥
  • Python RPC 远程调用脚本之 RPyC 实践

    最近有个监控需求,需要远程执行集群每个节点上的脚本,并获取脚本执行结果,为了安全起见不需要账号密码登陆节点主机,要求只需要调用远程脚本模块的方法就能实现。 总结...

    用户1177713
  • 借助云开发实现小程序的登陆注册功能

    因为我们账号密码的注册,就是把用户设置的账号密码存到数据库里,登陆也是从数据库里取账号和密码来校验。所以我们必须要有数据库。如果用传统的数据库来做,比较麻烦,所...

    编程小石头
  • Chrome PDFium 整数截断漏洞分析

    本文通过介绍漏洞 5 大原理进而进行 POC 分析、zlib 分析、FlateUncompress 分析等漏洞分析,并进行 gdb 调试,最终完成补丁分析。

    腾讯玄武实验室

扫码关注云+社区

领取腾讯云代金券