一丶ES6 容許爲函數的參數設置默認值,即直接寫在參數定義的後面。javascript
function log(x, y = 'World') { console.log(x, y); } log('Hello') // Hello World log('Hello', 'China') // Hello China log('Hello', '') // Hello
二丶與解構賦值結合java
function fetch(url, { body = '', method = 'GET', headers = {} }) { console.log(method); } fetch('http://example.com', {}) // "GET" fetch('http://example.com') // 報錯
三丶做用域函數
一旦設置了參數的默認值,函數進行聲明初始化時,參數會造成一個單獨的做用域(context)。等到初始化結束,這個做用域就會消失。這種語法行爲,在不設置參數默認值時,是不會出現的。(做用域就在參數的這個小括號裏面)fetch
var x = 1; function f(x, y = x) { console.log(y); } f(2) // 2
let x = 1; function f(y = x) { let x = 2; console.log(y); } f() // 1
四丶 rest 參數this
function add(...values) { let sum = 0; for (var val of values) { sum += val; } return sum; } add(2, 5, 3) // 10
五丶箭頭函數url
1.只有一個參數時能夠省略小括號,,,函數語句只有一句能夠勝率大括號,如spa
var f = v => v;
上面的箭頭函數等同於:rest
var f = function(v) { return v; };
2.使用注意點code
箭頭函數有幾個使用注意點。對象
(1)函數體內的this
對象,就是定義時所在的對象,而不是使用時所在的對象。
(2)不能夠看成構造函數,也就是說,不能夠使用new
命令,不然會拋出一個錯誤。
(3)不能夠使用arguments
對象,該對象在函數體內不存在。若是要用,能夠用 rest 參數代替。
(4)不能夠使用yield
命令,所以箭頭函數不能用做 Generator 函數。
3.this指向區別
箭頭函數的this指向定義函數所在的對象;
而普通函數的this指向運行時所在的對象,如
function Timer() { this.s1 = 0; this.s2 = 0; // 箭頭函數 setInterval(() => this.s1++, 1000); // 普通函數 setInterval(function () { this.s2++; }, 1000); } var timer = new Timer(); setTimeout(() => console.log('s1: ', timer.s1), 3100); setTimeout(() => console.log('s2: ', timer.s2), 3100); // s1: 3 // s2: 0