第三章 函數(shù)
1.函數(shù)形參的默認(rèn)值
function makeRequest(url, timeout = 2000, callback = function() {}) {
}
2.arguments
在非嚴(yán)格模式下, 命名參數(shù)的變化會(huì)同步更新到arguments對(duì)象中, 然而, 在ESMAScript5的嚴(yán)格模式下, 取消了arguments對(duì)象的這個(gè)令人感動(dòng)疑惑的行為
function(first) {
console.log(first === arguments[0]); // true (ESMAScript5的嚴(yán)格模式: true)
first = "c";
console.log(first === arguments[0]); // true (ESMAScript5的嚴(yán)格模式: false)
}
在ECMAScript6中, 如果函數(shù)使用了默認(rèn)參數(shù)值, 則無(wú)論是否顯示定義為嚴(yán)格模式, arguments對(duì)象行為都將與ECMAScript5嚴(yán)格模式下保持一致
3.默認(rèn)參數(shù)表達(dá)式
function getValue() {
return 5;
}
function add(first, second = getValue()) {
}
console.log(add(1, 1)); // 2
console.log(add(1)); // 6
4.不定參數(shù)
在函數(shù)的命名參數(shù)前添加三個(gè)點(diǎn)(...)就表明這是個(gè)不定參數(shù),該參數(shù)為一個(gè)數(shù)組
- 不定參數(shù)的使用限制:
- 每個(gè)函數(shù)最多只能聲明一個(gè)不定參數(shù), 而且一定要在所有參數(shù)末尾
- 不定參數(shù)不能使用于對(duì)象字面量setter中
- 無(wú)論是否使用不定參數(shù), arguments對(duì)象總是包含所有傳入函數(shù)的參數(shù);
function pick(object, ...keys) {
let result = Object.create(null);
for(let i = 0, len = keys.length; i < len; i++) {
result[keys[i]] = object[keys[i]];
}
return result;
}
5.展開運(yùn)算符
展開運(yùn)算符與不定參數(shù)類似(貌似功能相反那種)
展開運(yùn)算符可以打開指定的數(shù)組, 以獨(dú)立的形式傳入函數(shù)
需求:利用Math.max()求多個(gè)數(shù)的最大值, 希望以數(shù)組形式傳參
+ 可以這樣
let values = [25, 50, 75, 100];
console.log(Math.max.apply(Math, values));
+ 也可以這樣
console.log(Math.max(...values));
6.name屬性
為了解決匿名函數(shù)表達(dá)式的廣泛使用增加的調(diào)試難度, ES6增加了name屬性
function doSomething() {}
var doOther = function() {}
console.log(doSomething.name);
console.log(doOther.name);
7.元屬性(Metaproperty) new.target
為了判斷是否通過(guò)new關(guān)鍵字調(diào)用的問(wèn)題,ES6中引入new.target(注意點(diǎn): 只能在函數(shù)內(nèi)使用)這個(gè)元屬性
function Person(name) {
if(typeof new.target !== 'undefined') {
this.name = name;
}else {
throw new Error('必須通過(guò)new關(guān)鍵字調(diào)用函數(shù)');
}
}
var p = new Person("Jack");
var notP = Person.call(p, "Rose"); // 拋出錯(cuò)誤
8.塊級(jí)函數(shù)
塊級(jí)函數(shù)和let函數(shù)的區(qū)別: let函數(shù)不會(huì)被提升
"use strict";
if(true) {
console.log(typeof doSomething); // 拋出錯(cuò)誤
let doSomething = function() {}
doSomething();
}
console.log(typeof doSomething);
9.箭頭函數(shù)
- 沒(méi)有this, super, arguments, new.target綁定
- 不能通過(guò)new關(guān)鍵字調(diào)用
- 沒(méi)有原型