更新時間:2022-12-08 10:30:10 來源:動力節(jié)點 瀏覽1262次
每一個JavaScript程序員都是必須知道閉包是什么,閉包是函數(shù)式編程的核心概念之一,是引用了一個函數(shù)作為域中變量的函數(shù),簡單來說就是函數(shù)A用到了B函數(shù)中的變量,那么函數(shù)A就是個閉包。在我們面試相關崗位的時候,是有很大幾率問到有關問題的,為此,大家也需要作出準備,這幾個閉包面試題,可以參考下,非常具有挑戰(zhàn)性的。
有以下函數(shù) clickHandler,immediate和delayedReload:
let countClicks = 0;
button.addEventListener('click', function clickHandler() {
??countClicks++;
});
const result = (function immediate(number) {
??const message = `number is: ${number}`;
??return message;
})(100);
setTimeout(function delayedReload() {
??location.reload();
}, 1000);
這3個函數(shù)中哪個能夠訪問外部范圍變量?
下列代碼輸出什么:
(function immediateA(a) {
??return (function immediateB(b) {
????console.log(a); // => ?
??})(1);
})(0);
輸出為:0
用參數(shù) 0 調(diào)用 immediateA,因此 a 參數(shù)為 0。
immediateB 函數(shù)嵌套在 immediateA 函數(shù)中,是一個閉包,它從外部 immediateA 作用域中得到 a 變量,其中 a 為 0。因此 console.log(a) 的輸出為 0。
下面的代碼將會輸出什么內(nèi)容?
let count = 0;
(function immediate() {
??if (count === 0) {
????let count = 1;
????console.log(count); // 輸出什么?
??}
??console.log(count); // 輸出什么?
})();
輸出 1 和 0
第一個語句 let count = 0 聲明了一個變量 count。
immediate() 是一個閉包,它從外部作用域得到 count 變量。在 immediate() 函數(shù)作用域內(nèi), count 是 0。
但是,在條件內(nèi),另一個 let count = 1 聲明了局部變量 count,該變量覆蓋了作用域之外的 count。第一個 console.log(count) 輸出 1。
第二個 console.log(count) 輸出為 0 ,因為這里的 count 變量是從外部作用域訪問的。
下列代碼輸出什么:
for (var i = 0; i < 3; i++) {
??setTimeout(function log() {
????console.log(i); // => ?
??}, 1000);
}
輸出:3, 3, 3。
代碼分為兩個階段執(zhí)行。
階段1
for() 重復 3 次。在每次循環(huán)都會創(chuàng)建一個新函數(shù) log(),該函數(shù)將捕獲變量 i。 setTimout() 安排log() 在 1000 毫秒后執(zhí)行。
當 for() 循環(huán)完成時,變量 i 的值為 3。
階段2
第二階段發(fā)生在 1000ms 之后:
setTimeout() 執(zhí)行預定的 log() 函數(shù)。 log() 讀取變量 i 當前的值 3,并輸出 3
所以輸出 3, 3, 3。
下面的代碼將會輸出什么:
function createIncrement() {
??let count = 0;
??function increment() {
????count++;
??}
?
??let message = `Count is ${count}`;
??function log() {
????console.log(message);
??}
???
??return [increment, log];
}
?
const [increment, log] = createIncrement();
increment();
increment();
increment();
log(); // => ?
輸出:'Count is 0'
increment() 函數(shù)被調(diào)用 3 次,將 count 增加到 3。
message 變量存在于 createIncrement() 函數(shù)的作用域內(nèi)。其初始值為 'Count is 0'。但即使 count 變量已經(jīng)增加了幾次,message 變量的值也始終為 'Count is 0'。
log() 函數(shù)是一個閉包,它從 createIncrement() 作用域中獲取 message 變量。 console.log(message) 輸出錄'Count is 0'到控制臺。
以上就是2023比較難搞的五個Javascript閉包面試題,你能回答上來嗎?如果想要了解更多的Java面試題相關內(nèi)容,可以關注動力節(jié)點Java官網(wǎng)。
0基礎 0學費 15天面授
有基礎 直達就業(yè)
業(yè)余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習