一、面試高頻:apply 與 call 調用模式的區別
apply
和 call
的核心作用一致——改變函數內 this
的指向并立即執行函數,唯一區別是參數傳遞方式不同:
apply
:第二個參數需以數組形式傳入,格式為函數名.apply(this指向, [參數1, 參數2, ...])
- 示例:
test.apply(param, [1, 2, 3]);
- 示例:
call
:第二個及以后參數需以逗號分隔傳入,格式為函數名.call(this指向, 參數1, 參數2, ...)
- 示例:
test.call(param, 1, 2, 3);
- 示例:
實際開發中可根據參數是否已存在于數組中選擇:若參數是零散值,call
寫法更簡潔;若參數已在數組里,apply
無需額外拆解。
二、必懂語法:逗號運算符的規則
逗號運算符的核心規則:執行所有用逗號分隔的表達式,最終返回最后一個表達式的結果。
示例:(i -= 2, [true, 'abc'][i]['length'])
中,先執行 i -= 2
(i 從 3 變為 1),再執行 [true, 'abc'][1]['length']
(取數組下標 1 的 ‘abc’,再取其長度 3),最終返回 3。
三、實戰編程題:從定義到調用(附完整代碼)
以下題目覆蓋函數、對象、事件綁定等核心場景,均為面試高頻考點,附詳細注釋和運行邏輯。
01 定義“重復執行函數”:指定次數+執行函數
需求:創建函數,接收“執行次數”和“待執行函數”兩個參數,按次數重復執行函數。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>重復執行函數</title>
</head>
<script>
// 函數定義:a=執行次數,b=待執行函數
function repeatExecute(a, b) {for (let i = 1; i <= a; i++) {b(); // 每次循環執行函數b}
}
// 函數調用:執行3次,每次打印內容
repeatExecute(3, function() {console.log("第" + i + "次執行函數");
});
</script>
<body></body>
</html>
02 定義“返回函數的函數”:嵌套函數調用
需求:創建函數,其返回值是另一個帶打印語句的函數,最終調用并執行打印。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>返回函數的函數</title>
</head>
<script>
// 外層函數:返回一個匿名函數
function getInnerFunc() {return function() {console.log("成功調用內層函數的打印語句");};
}
// 調用方式:外層函數()() → 先執行外層獲取內層函數,再執行內層函數
getInnerFunc()();
</script>
<body></body