深入理解ES6之函数
一:关于函数的参数:
可以接受任意数量的参数而无视函数声明的参数数量是js函数的独特之处。
1:参数默认值
ES6之前做法:
function makeRequest(url,timeout,callback){
timeout=timeout||2000;
callback = callback||function(){}
}
但是这样timeout如果设置为0,还是会使用默认值。因此更安全的方法是使用typeof来检测类型。
function makeRequest(url,timeout,callback){
timeout=(typeof timeout !=='undefined')?timeout:2000;
}
ES6做法:
functiong makeRequest(url,timeout=2000,callback=functing(){}){}
//只有在传入undefined或者不传时才会使用默认值 如果参数是null不适用默认值
makeRequest("xxxx",undefined,null)//第一个"xxxx",第二个使用默认值2000,第三次使用null
2:arguments对象
function mixArgs(first,second = 'b'){
arguments.length = 1
first === arguments[0] true;
second ===arguments[1] false;//second='b', arguments[1]='undefined'
}
mixArgs(1);
arguments对象的值传入后就不在改变永远等于初始值。
3:默认参数表达式
function getValue(value){
return value+5;
}
//表达式中可以说使用之前的参数,但不能使用后面的参数
function add (first,second=getValue(first)){
}
4:不具名参数
arguments对象包含的是传入的全部参数,有时候操作起来还是比较麻烦。
ES6通过引入剩余参数,可以包括显示声明的其他参数。
function pick(obj,..keys){
}
1:剩余参数只能发到最后
2:剩余参数不能再对象的setter属性中使用,因为setter被限定为只是用单个参数,而剩余参数是不限定数量的。
二:块级函数:
"use strict"
if(true){
console.log(type doSomething);// "function"
function doSomething(){}
doSomething();
}
console.log(type doSomething);// "undefined" 如果是非严格模式这里也会是"function"
在严格模式下定义的块级函数会被提升到块级作用域的顶部。而在非严格模式下会被提升至全局作用域,因此在代码块外部依然可以使用。
"use strict"
if(true){
console.log(type doSomething);// "undefined"//函数表达式不能提升 因此这里暂时性死区
let doSomething = function(){}
doSomething();
}
console.log(type doSomething);// "undefined"
三:箭头函数:
1:没有this,super,arguments,也没有new.target绑定,这些值由离箭头函数最近的非箭头函数来决定.
2:不嫩被使用new调用,箭头函数没有构造方法,使用new调用会报错。
3:不能更改this
function createArrow(){ return ()=>argument[0]}
var arrowFunction = createArrow(5)
console.log(arrowFunction()) // 5
箭头函数:
function add(x,y){return x+y};
///这是es5中定义函数的写法,es6中我们可以这么搞:
var add=(x,y)=>x+y;
add(1,2);//3,正常运行
var fun1=x=>x+1;
fun1(3);//4,当参数为1个的时候 可以再简单一点,当然复杂函数还是需要括号与大括号的
['a','b','c'].map(x=>x);//["a", "b", "c"]
var fun2=(...args)=>{
for(let arg of args){
console.log(arg)
}
};
fun2(1,2,3);//1,2,3配合rest参数
箭头函数中的this:
let obj1={fun:function(){
setTimeout(function(){console.log(this)})
}};
obj1.fun();//Window,上例是传统的定义函数,this的指向改为了window,通常情况下,我们都是在setTimeout外面定义that=this来确定指向,解决问题。
obj2={fun:function(){
setTimeout(()=>console.log(this))
}};
obj2.fun();//Object(),箭头函数下的this指向并没有改变,而是指向obj2,
箭头函数体内的this指向的是定义时所在的对象,而不是执行时所在的对象。箭头函数绑定this的指向,很大程度解决了过去this动态指向的困扰,可以大大减少显示绑定this对象的写法(call,apply,bind)。
es6中函数参数:
function fun1(x='a'){console.log(x)};
fun1();//a,没有参数的时候,依然能够打印出默认值a
let fun2=(x=1,y=2)=>x+y;
fun2();//3,没有参数情况下,参数取默认
fun2(10);//12只有一个参数时,y为默认值
fun2(2,5);//7参数个数等于形参时候,参数取实参
fun2(4,5,6);//9参数数量超标时,行为如ES5
let fun3=function(x=1,y=2){this.x=x;this.y=y}
let newFun=new fun3;
//newFun={x:1,y:2}构造函数也可以设置默认值,注意箭头函数不可以当做构造函数,即使用new命令时会报错
let fun4=({x,y=2})=>console.log(x,y)
fun4();//报错,因为fun4的参数为一个对象
fun4({});//undefined,2
fun4({x:2,y:4});//2,4
fun4({x:2});//2,2
let fun5=(x,y)=>{let x=5;return x};//报错,let命令不允许重复定义
深入理解ES6之函数的更多相关文章
- 深入理解ES6箭头函数中的this
简要介绍:箭头函数中的this,指向与一般function定义的函数不同,比较容易绕晕,箭头函数this的定义:箭头函数中的this是在定义函数的时候绑定,而不是在执行函数的时候绑定. 1.何为定义时 ...
- 深入理解ES6箭头函数的this以及各类this面试题总结
ES6中新增了箭头函数这种语法,箭头函数以其简洁性和方便获取this的特性,俘获了大批粉丝儿 它也可能是面试中的宠儿, 我们关键要搞清楚 箭头函数和普通函数中的this 一针见血式总结: 普通函数中的 ...
- (转载) 深入理解ES6箭头函数的this以及各类this面试题总结
声明:本文转载自 https://blog.csdn.net/yangbingbinga/article/details/61424363 ES6中新增了箭头函数这种语法,箭头函数以其简洁性和方便获取 ...
- 理解es6箭头函数
箭头函数知识点很少,但是要理解清楚,不然看代码会很不适应的. 1. 最简单的写法 x => x*x 可以理解为 我的x要被转化为x*x,所以实际相当于下边的这个 function (x){ re ...
- 对于es6的小小理解之generator函数
相信很多学js的人都看过es6,我也是最近才看的es6标准.下面我来说一下我对es6笼统的看法,如有不对欢迎评论交流. js有很长很长的历史,大家应该都有了解过.es6是15年发布的版本,由TC39主 ...
- es6箭头函数 this 指向问题
es5中 this 的指向 var factory = function(){ this.a = 'a'; this.b = 'b'; this.c = { a:'a+', b:function(){ ...
- ES6生成器函数generator
ES6生成器函数generator generator是ES6新增的一个特殊函数,通过 function* 声明,函数体内通过 yield 来指明函数的暂停点,该函数返回一个迭代器,并且函数执行到 y ...
- ES6 — 箭头函数
一 为什么要有箭头函数 我们在日常开发中,可能会需要写类似下面的代码 const Person = { 'name': 'little bear', 'age': 18, 'sayHello': fu ...
- 前端分享----JS异步编程+ES6箭头函数
前端分享----JS异步编程+ES6箭头函数 ##概述Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只 ...
随机推荐
- h5聊天工具的开发过程及思路
这个产品的主要技术栈有,网易nim即时通信,vue-cli,muse-ui 1.在拿到这个需求时,脑袋里空的,什么想法都没有,完全懵逼,进了网易云通信的官网api查看,由于我做的是客户端的,所以重点看 ...
- 斐讯K2P通过配置文件开启telnet的原理分析
看过几篇教程之后我已经知道怎么备份固件了.但是现在有一个问题,我的本意是把K2P原机带的固件备份出来,用教程上的方法进行开启telnet.备份固件等操作是否会改变固件呢?下面我们来验证这个问题. Op ...
- 面试笔试(C++部分)
1.define 和const,inline的区别 define的缺点: 1.边界效应(必须加括号,才能避免边界效应) #define MUL(A,B) A*B 而在使用的时候,这样的调用: ,b=, ...
- CSS的nth-of-type和nth-child的区别
<!--源代码--><!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- centos的基本命令01
01:创建用户命令 useradd liulaoshi # 创建用户 passwd liulaoshi # 设置密码, 回车后会提示让你输入两次密码 1.用户列表文件:/etc/passwd/ 2.用 ...
- MySQL授权命令grant的详细使用方法
2019-01-07 转自 https://www.cnblogs.com/crxis/p/7044582.html 本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的 ...
- 漫谈TCPIP协议原理
一.每次说道TCPIP协议,有能说会道者,总爱说三次握手,什么意思? 顾名思义,假设有两个机器A和B 1.当A发送给B一个包的时候,B接收到了,这个时候,B有两个选择,要么将包数据放入缓存,等待处理, ...
- HTTP请求的常用方法有哪些
HTTP请求的常用方法有:GET方法.POST方法.HEAD方法.PUT方法.DELETE方法.CONNECT方法.OPTIONS方法.TRACE方法.下面本篇文章就给大家介绍具体介绍一下HTTP请求 ...
- CSAPP阅读笔记-汇编语言初探(控制类指令)-来自第三章3.6的笔记-P135-P163
1.正溢出与负溢出: 首先,一个正数与一个负数相加,不可能溢出,因为结果的绝对值一定小于两个加数的绝对值,既然两个加数能合理表示出来,结果一定也能合理表示出来. 其次,正溢出是由于两个很大的正数相加, ...
- nginx常用配置3
## 六.浏览器本地缓存配置 语法:expires 60 s|m|h|d ```动静分离效果: server { listen 80; server_name localhost; location ...