深入理解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命令不允许重复定义
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 我和你在一起充满了缘分,想想刚认识,还没在一起,在一起,这过程,多么的美妙, 第一次,因为朋友介绍才认识才有联系。...
    写给我的她阅读 266评论 0 1
  • 前天,我和他吵架了。吵得很凶。彼此怒目相对,恶语相向,温度瞬间跌倒了零点。 吵过那么多次的架,外人看来,我们都是在...
    乐正丶弦生阅读 1,385评论 0 2