ES6對函數的擴展函數蠻多的,不過經常使用的估計也就是默認值和箭頭函數了。數組
函數參數默認值:bash
估計不少人都這樣用過默認值:函數
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無效。還有一點,沒有默傳參狀況下才會賦值:this
function fn(x = (function () {
console.log('執行');
})(), y = 20) {
}
fn()//執行fn(10)
複製代碼
參數默認值和解構賦值配合使用:spa
function fn({x = 10, y = 20} = {}) {
console.log(x);
console.log(y);
}
fn()//10 20
fn({x: 30, y: 40})//30 40
複製代碼
Length屬性:code
簡單說就是參數個數:cdn
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 我的筆記