es6對于函數(shù)也進行了一定的優(yōu)化,主要包括:參數(shù)的默認值缘屹、rest參數(shù)、擴展運算符(...)侠仇、箭頭函數(shù)以及this。
它們有一個共同的有點就是:使得代碼更加簡潔犁珠,結(jié)合需求靈活使用逻炊,可以大大地提高開發(fā)效率。
參數(shù)的默認值:
function func(a,b,c="100"){
console.log(a,b,c)
}
由實例可看出需要有幾點注意的:
1.默認參數(shù)需要放在最后一位犁享;
2.如果在啟動函數(shù)時候余素,沒有傳對應(yīng)參數(shù),或者傳為undefined炊昆,那么就會啟用默認值桨吊;
3.傳入的值不能再函數(shù)內(nèi)部聲明,會報錯凤巨,因為已經(jīng)聲明了视乐。
rest參數(shù):
rest在中文中的意思是剩余的意思,如果在函數(shù)中敢茁,就代表剩余的參數(shù)佑淀,例如:
function func(val,...vals){
console.log(vals)
}
let _this;
func(_this ,1,2,3,4,5,6)
//[1, 2, 3, 4, 5, 6]
從實例中可看出vals把除了第一位參數(shù)排除外,剩余的參數(shù)都打包成了一個數(shù)組彰檬,在函數(shù)體內(nèi)運行伸刃,這樣不管傳入多少函數(shù),都可以通過數(shù)組的方法進行操作逢倍。
與此同時我們引入了一個“...”三個點號的模式捧颅,這就稱之為擴展運算符,它有什么用呢较雕,一般都是結(jié)合參數(shù)來使用碉哑,就是在有多個參數(shù)之后,我們不想寫這么多,只想引用時候谭梗。
function func(a,b,c) {
console.log(a,b,c)
}
let arr = [1,2,3];
func(...arr);
即:傳入值的時候會將數(shù)組轉(zhuǎn)化為參數(shù)序列忘晤。
箭頭函數(shù):
var func1=a=>a;
var func2=(a,b)=>a;
var func3=(a,b)=>{return a+b};
上面是三個函數(shù)實例,所謂的箭頭函數(shù)就是用“=>”來進行定義函數(shù)激捏,
1.如果入?yún)⒁粋€返回值是一個设塔,就直接用“=>”連接,
2.如果入?yún)⒊^一個远舅,那入?yún)⒕托枰眯±ㄌ柊饋恚?/p>
3.如果函數(shù)運行代碼大于一行闰蛔,就需要用大括號包裹函數(shù)體。
this:
this是一個比較復(fù)雜的事图柏,在es6之前的版本中序六,定義的this和運行的this是不一致的,
而如果是用箭頭函數(shù)定義的this蚤吹,永遠都是定義時候的this例诀,不管在何種環(huán)境執(zhí)行。
look例子:
var obj = {
name:"我是name", //屬性name
show(){
//延遲500毫秒裁着,輸出x的值
setTimeout(
//匿名函數(shù)
function(){console.log(this.name);},
500
);
}
};
obj.show();//打印結(jié)果:undefined
沒錯繁涂,name的值確實是“我是name”,但問題出在了this上二驰,
當(dāng)代碼執(zhí)行到了setTimeout()的時候扔罪,此時的this已經(jīng)變成了window對象(setTimeout()是window對象的方法),
已經(jīng)不再是obj對象了桶雀,所以我們用this.name獲取的時候矿酵,獲取的不是obj.name的值,而是window.name的值矗积,
再加上window上沒有定義屬性name全肮,所以得到的結(jié)果就是:undefined
如果我們用箭頭函數(shù)進行定義那就完全不同了。
var obj = {
name:"我是name", //屬性name
show(){
//延遲500毫秒棘捣,輸出x的值
setTimeout(
//匿名函數(shù)
()=>{console.log(this.name);},
500
);
}
};
obj.show();//打印結(jié)果:我是name
因為箭頭函數(shù)中的this指向的是定義時的this倔矾,定義時候show的方法是掛載在obj上的,所以執(zhí)行時候可以找到obj.name柱锹。
關(guān)于函數(shù)方面的知識就是這些哪自,都是一些實用的方法,期待與你一起進步禁熏。