功能
作為第一類對(duì)象蛉艾,函數(shù)和JS中其他對(duì)象一樣依鸥,類似于其對(duì)象類型,函數(shù)具有以下功能:
- 通過字面量創(chuàng)建
function fun1() { }
- 賦值給變量壕鹉、數(shù)組項(xiàng)或其他對(duì)象的屬性
// 為變量賦值一個(gè)新函數(shù)
let v1 = function fun2() { };
// 向數(shù)組中增加一個(gè)函數(shù)
let arr1 = [];
arr1.push(function () { });
// 給對(duì)象的屬性賦值為一個(gè)新函數(shù)
let obj1 = {};
obj1.name = function () {};
- 作為函數(shù)的參數(shù)來傳遞
function fun2(test) {
test();
}
fun2(function () { });
- 作為函數(shù)的返回值
function fun3() {
return function () {};
}
- 具有動(dòng)態(tài)創(chuàng)建和分配的屬性
let v2 = function () {};
v2.name = "test";
- 回調(diào)函數(shù)是被代碼隨后“回來調(diào)用”的函數(shù)垄开,它是一種很常用的函數(shù)琴许,特別是在事件處理場(chǎng)景下
let button = document.getElementById("callback");
button.addEventListener("click", function () {
console.log("button 點(diǎn)擊了!");
});
- 函數(shù)具有屬性,而且這些屬性能夠被存儲(chǔ)任何信息溉躲,我們可以利用這個(gè)特性來做很多事情
// 可以在函數(shù)屬性中存儲(chǔ)另一個(gè)函數(shù)榜田,用于之后的引用和調(diào)用
let store = {
nextId: 1,
cache: {},
add: function (fn) {
// 僅當(dāng)函數(shù)唯一時(shí)才將該函數(shù)加入緩存
if (!fn.id) {
fn.id = this.nextId++;
this.cache[fn.id] = fn;
return true;
} else {
return false;
}
}
};
function fun4() {}
console.log(store.add(fun4));// true
console.log(store.add(fun4)); // false
// 可以用函數(shù)屬性創(chuàng)建一個(gè)緩存(記憶),用于減少不必要的計(jì)算
function f5(value) {
// 計(jì)算某個(gè)數(shù)是否是素?cái)?shù)
if (!f5.answers) {
// 給函數(shù)創(chuàng)建一個(gè)緩存對(duì)象屬性
f5.answers = {};
}
// 檢查value是否已在緩存對(duì)象中
if (f5.answers[value] !== undefined) {
return f5.answers[value];
}
// 前提條件該value不能是0和1锻梳,因?yàn)檫@兩個(gè)數(shù)不是素?cái)?shù)
let isPrime = value !== 0 && value !== 1;
for (let i = 2; i < value; i++) {
if (value % i === 0) {
isPrime = false;
break;
}
}
return f5.answers[value] = isPrime;
}
console.log(f5(5)); // true
console.log(f5.answers[5]); // true
函數(shù)定義方式
- 函數(shù)聲明
function f6() {}
- 函數(shù)表達(dá)式
// 作為賦值表達(dá)式的右值
let v6 = function () {};
// 作為其它函數(shù)的參數(shù)
f6(function () {});
// 作為函數(shù)返回值
function f7() {
return function () {};
}
- 立即函數(shù)箭券。JS引擎解析到時(shí)會(huì)馬上執(zhí)行函數(shù)
+function () {console.log("立即函數(shù)");}();
-function () {}();
!function () {}();
~function () {}();
(function () {})();
- 箭頭函數(shù)
let arr2 = [0, 3, 2, 5, 4, 8, 1];
arr2.sort((value1, value2) => value1 - value2);
- 函數(shù)構(gòu)造函數(shù)
console.log(new Function("a", "b", "return a + b")(1, 2));
- 生成器函數(shù)
function* myGen() {
yield 10;
y = yield "foo";
yield y;
}
let gen = myGen();
console.log(gen.next());// {value: 10, done: false}
console.log(gen.next());// {value: "foo", done: false}
// 第二次函數(shù)調(diào)用時(shí),遇到y(tǒng)ield就把值返回了疑枯,并未給y賦值
console.log(gen.next());// {value: undefined, done: false}
console.log(gen.next());// {value: undefined, done: true}
函數(shù)參數(shù)
- 剩余參數(shù)
// 不與任何形參名相匹配的額外實(shí)參可能通過剩余參數(shù)來引用
function f8(value, ...restParam) {
for (let i = 0; i < restParam.length; i++) {
console.log(`剩余參數(shù):${restParam[i]}`);// 2,3,4
}
}
f8(1, 2, 3, 4);
- 默認(rèn)參數(shù)
function f9(name, action = "舞蹈") {
console.log(`${name}喜歡${action}`)
}
f9("Lily");// Lily喜歡舞蹈
f9("Jack", "藍(lán)球");// Jack喜歡藍(lán)球