黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 職業指南 JS閉包面試題,看看你會多少

JS閉包面試題,看看你會多少

更新時間:2023-01-14 14:38:41 來源:動力節點 瀏覽1360次

閉包是什么是每一位Javascript程序員必須要了解知道的,在日后我們的面試中,這類相關的問題肯定是必不可少的,不深入了解的話是很容易被問倒的,一下是小編整理的幾個Javascript閉包面試問題,大家看看會不會呢:

js閉包面試題

1. 熱身

有以下函數 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個函數中哪個能夠訪問外部范圍變量?

答案

  • clickHandler 能夠從外部作用域訪問變量 countClicks。
  • immediate 無法訪問外部作用域中的任何變量。
  • delayedReload 從全局作用域(也就是最外層作用域)中訪問全局變量 location。

2. 丟失的參數

下列代碼輸出什么:

(function immediateA(a) {
  return (function immediateB(b) {
    console.log(a); // => ?
  })(1);
})(0);

答案

輸出為:0

用參數 0 調用 immediateA,因此 a 參數為 0。

immediateB 函數嵌套在 immediateA 函數中,是一個閉包,它從外部 immediateA 作用域中得到 a 變量,其中 a 為 0。因此 console.log(a) 的輸出為 0。

3. 誰是誰

下面的代碼將會輸出什么內容?

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() 函數作用域內, count 是 0。

但是,在條件內,另一個 let count = 1 聲明了局部變量 count,該變量覆蓋了作用域之外的 count。第一個 console.log(count) 輸出 1。

第二個 console.log(count) 輸出為 0 ,因為這里的 count 變量是從外部作用域訪問的。

4. 棘手的閉包

下列代碼輸出什么:

for (var i = 0; i < 3; i++) {
  setTimeout(function log() {
    console.log(i); // => ?
  }, 1000);
}

答案

輸出:3, 3, 3。

代碼分為兩個階段執行。

階段1

  1. for() 重復 3 次。在每次循環都會創建一個新函數 log(),該函數將捕獲變量 i。 setTimout() 安排log() 在 1000 毫秒后執行。
  2. 當 for() 循環完成時,變量 i 的值為 3。

階段2

第二階段發生在 1000ms 之后:

  • setTimeout() 執行預定的 log() 函數。 log() 讀取變量 i 當前的值 3,并輸出 3

所以輸出 3, 3, 3。

5. 錯誤的信息

下面的代碼將會輸出什么:

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() 函數被調用 3 次,將 count 增加到 3。

message 變量存在于 createIncrement() 函數的作用域內。其初始值為 'Count is 0'。但即使 count 變量已經增加了幾次,message 變量的值也始終為 'Count is 0'。

log() 函數是一個閉包,它從 createIncrement() 作用域中獲取 message 變量。 console.log(message) 輸出錄'Count is 0'到控制臺。

以上就是“JS閉包面試題,看看你會多少”,你能回答上來嗎?如果想要了解更多的Java面試題相關內容,可以關注動力節點Java官網。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 日韩一级一欧美一级国产 | 香蕉视频一区 | 丁香欧美 | 黄色网址免费在线播放 | 黄网免费视频 | 一区二区三区在线 | 欧 | 香蕉网站在线观看 | 521a久久九九久久精品 | 久久久久成人精品免费播放动漫 | 免费看涩涩视频网站入口 | 亚洲国产精品一区二区久 | 国产成人精品无缓存在线播放 | 天堂视频免费看 | 国产人成久久久精品 | 亚洲日本高清成人aⅴ片 | free性欧美人另类 | 国产亚洲精品成人久久网站 | 亚洲精品二区中文字幕 | 日本一区二区不卡视频 | www.99视频| 欧美国产永久免费看片 | 最近中文免费字幕在线播放 | 黄 在线| 免费欧美在线视频 | 看真人视频一一级毛片 | 久久久午夜影院 | 国产成人午夜精品5599 | 青青草国产精品免费 | 成人影片在线播放 | 国产大臿蕉香蕉大视频女 | 免费在线观看黄色小视频 | www.亚洲国产 | 99久久九九 | 人人爽天天爽 | 五月天婷婷一区二区三区久久 | 野猫鲁24小时网址最新 | 一级毛片免费在线播放 | 色综合97天天综合网 | 成年免费网站 | 香蕉视频a级片 | 嘿嘿嘿视频免费网站在线观看 |