? ? ?ES6上函數(shù)的擴展表現(xiàn)在不僅體現(xiàn)在參數(shù)和屬性變化還有具體函數(shù)表現(xiàn)形式的變化涩禀。
? ? ? 首先是ES6上函數(shù)參數(shù)上的變化,ES6上函數(shù)的參數(shù)可以設(shè)置默認值瞭空,當(dāng)調(diào)用的時候沒有設(shè)置對應(yīng)參數(shù)值(即沒有對應(yīng)參數(shù)) 杆兵,即開始調(diào)用默認參數(shù)值雁仲。參數(shù)變量都是默認聲明的,所以在表達式中再采用let或者const去聲明就會產(chǎn)生錯誤(var就不會了)琐脏;在已經(jīng)存在設(shè)置了默認值的參數(shù)的函數(shù)不能再存在同名函數(shù)(這會導(dǎo)致默認值的賦值是否會在兩個同名函數(shù)上生效攒砖,產(chǎn)生混亂);函數(shù)參數(shù)默認值是表達式的時候日裙,每次調(diào)用函數(shù)吹艇,參數(shù)的默認值都會重新根據(jù)表達式進行計算。ES6中函數(shù)參數(shù)和解構(gòu)賦值結(jié)合,可以根據(jù)參數(shù)是否存在默認值阅签、調(diào)用函數(shù)時傳入的參數(shù)是否存在是否為空是否為對應(yīng)對象掐暮,產(chǎn)生多種結(jié)果和錯誤蝎抽,可以自己試一哈政钟。函數(shù)參數(shù)設(shè)置默認值路克,在調(diào)用的時候,會產(chǎn)生參數(shù)自己的一個作用域和函數(shù)表達式一個作用域养交,參數(shù)自己的作用域變量是參數(shù)存在取參數(shù)精算,參數(shù)不存在直接取外層全局變量,注意不同的作用域和變量的作用范圍碎连。其次ES6支持一種rest參數(shù)灰羽,其實就是...values來表示多個參數(shù)(好low的感覺有木有),而且用這個東西做參數(shù),只能放到參數(shù)的最后一個鱼辙,不然就報錯(好矯情有木有)廉嚼。
? ? ?其次是函數(shù)的一些屬性,fun.length原來是可以用來表示fun的參數(shù)個數(shù)倒戏,但是為參數(shù)設(shè)置默認值之后length的表達就不準(zhǔn)確了怠噪,fun.length將用來指定沒有設(shè)置默認值的參數(shù)的個數(shù),而且rest參數(shù)的length為0杜跷,不是尾參數(shù)設(shè)置默認值的情況下該參數(shù)以后的參數(shù)個數(shù)都不會計入length中傍念。fun.name返回函數(shù)的名稱,在ES6上不管是匿名函數(shù)還是其他函數(shù)都可以把函數(shù)名給你顯示出來葛闷。
? 下面就是體現(xiàn)在數(shù)組憋槐,對象上的擴展,簡寫(估摸是都想偷個懶)淑趾,=> === function 阳仔,利用箭頭定義一個函數(shù),var s = function(x){return x} === var s = (x) => x; (x)=>{return 多于一條語句的表達式}扣泊,(x) =>(對象)驳概,但是簡寫也帶來了一些別的不同,簡寫的函數(shù)體內(nèi)this指向的是定義式所在的對象旷赖,而且不能當(dāng)作構(gòu)造函數(shù)(太草率),不能用arguments(函數(shù)體內(nèi)不存在)顺又,不能用作yield函數(shù)(這個函數(shù)還是比較特殊好吧);而且這個箭頭作用的函數(shù)還可以相互嵌套等孵,不過看著有點亂好吧稚照。綁定this對象 ::用來替代apply,call俯萌,bind果录,obj::fun,函數(shù)的this即是對象咐熙,::obj.fun,即是fun中的this指向obj弱恒。
? ? 最后就是一個類似閉包的東西,尾調(diào)用棋恼,即函數(shù)中最后一步是調(diào)用最后一個參數(shù)返弹,注意函數(shù)中return的步驟和作用锈玉,但是還跟閉包不一樣,閉包是函數(shù)返回函數(shù)义起,而尾調(diào)用是函數(shù)返回函數(shù)的調(diào)用拉背。函數(shù)結(jié)尾返回函數(shù)本身的調(diào)用叫做尾遞歸,注意包括尾遞歸優(yōu)化和尾調(diào)用優(yōu)化所在的嚴格模式下的arguments(參數(shù))默终,caller(函數(shù)本身)的失真問題==》報錯椅棺。還有就是ES6需要在多行參數(shù)后面跟,但是之前是不可以的(會報錯),和try{}catch{}只在不需要拋錯的地方使用齐蔽。
? ? ? ?這章寫的好無聊两疚,不扯了,下班回家含滴。