精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

這7道關于閉包的面試題,你能答對幾個?

開發(fā) 前端
每個JavaScript程序員都必須知道閉包是什么。在JavaScript面試中,你很可能會被問到閉包的概念。以下是7個有關JavaScript閉包的面試題,比較有挑戰(zhàn)性。

每個 JavaScript 程序員都必須知道閉包是什么。在 JavaScript 面試中,你很可能會被問到閉包的概念。

以下是 7 個有關 JavaScript 閉包的面試題,比較有挑戰(zhàn)性。

不要查看答案或運行代碼,看看自己的水平到底如何。做完這些題大約需要半小時左右。

[[384154]]

1.  熱身

有以下函數(shù) clickHandler,immediate和delayedReload:

  1. let countClicks = 0
  2. button.addEventListener('click', function clickHandler() { 
  3.   countClicks++; 
  4. }); 
  5. const result = (function immediate(number) { 
  6.   const message = `number is: ${number}`; 
  7.   return message; 
  8. })(100); 
  9. setTimeout(function delayedReload() { 
  10.   location.reload(); 
  11. }, 1000); 

這3個函數(shù)中哪個能夠訪問外部范圍變量?

答案:

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

2. 丟失的參數(shù)

下列代碼輸出什么:

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

答案:

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

3. 誰是誰

下面的代碼將會輸出什么內(nèi)容?

  1. let count = 0
  2. (function immediate() { 
  3.   if (count === 0) { 
  4.     let count = 1
  5.     console.log(count); // 輸出什么? 
  6.   } 
  7.   console.log(count); // 輸出什么? 
  8. })(); 

答案:

  • 輸出 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 變量是從外部作用域訪問的。

4. 棘手的閉包

下列代碼輸出什么:

  1. for (var i = 0; i < 3; i++) { 
  2.   setTimeout(function log() { 
  3.     console.log(i); // => ? 
  4.   }, 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。

5. 錯誤的信息

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

  1. function createIncrement() { 
  2.   let count = 0
  3.   function increment() {  
  4.     count++; 
  5.   } 
  6.  
  7.   let message = `Count is ${count}`; 
  8.   function log() { 
  9.     console.log(message); 
  10.   } 
  11.    
  12.   return [increment, log]; 
  13.  
  14. const [increment, log] = createIncrement(); 
  15. increment();  
  16. increment();  
  17. increment();  
  18. 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'到控制臺。

6. 重新封裝

下面的函數(shù) createStack() 用于創(chuàng)建棧結(jié)構(gòu):

  1. function createStack() { 
  2.   return { 
  3.     items: [], 
  4.     push(item) { 
  5.       this.items.push(item); 
  6.     }, 
  7.     pop() { 
  8.       return this.items.pop(); 
  9.     } 
  10.   }; 
  11.  
  12. const stack = createStack(); 
  13. stack.push(10); 
  14. stack.push(5); 
  15. stack.pop(); // => 5 
  16.  
  17. stack.items; // => [10] 
  18. stack.items = [10, 100, 1000]; // 棧結(jié)構(gòu)的封裝被破壞了 

它能正常工作,但有一個小問題,因為暴露了 stack.items 屬性,所以任何人都可以直接修改 items 數(shù)組。

這是一個大問題,因為它破壞了棧的封裝:應該只有 push() 和 pop() 方法是公開的,而 stack.items 或其他任何細節(jié)都不能被訪問。

使用閉包的概念重構(gòu)上面的棧實現(xiàn),這樣就無法在 createStack() 函數(shù)作用域之外訪問 items 數(shù)組:

  1. function createStack() { 
  2.   // 把你的代碼寫在這里 
  3.  
  4. const stack = createStack(); 
  5. stack.push(10); 
  6. stack.push(5); 
  7. stack.pop(); // => 5 
  8.  
  9. stack.items; // => undefined 

答案:

以下是對 createStack() 的重構(gòu):

  1. function createStack() { 
  2.   const items = []; 
  3.   return { 
  4.     push(item) { 
  5.       items.push(item); 
  6.     }, 
  7.     pop() { 
  8.       return items.pop(); 
  9.     } 
  10.   }; 
  11.  
  12. const stack = createStack(); 
  13. stack.push(10); 
  14. stack.push(5); 
  15. stack.pop(); // => 5 
  16.  
  17. stack.items; // => undefined 

items 已被移至 createStack() 作用域內(nèi)。

這樣修改后,從 createStack() 作用域的外部無法訪問或修改 items 數(shù)組。現(xiàn)在 items 是一個私有變量,并且棧被封裝:只有 push() 和 pop() 方法是公共的。

push() 和 pop() 方法是閉包,它們從 createStack() 函數(shù)作用域中得到 items變量。

7. 智能乘法

編寫一個函數(shù) multiply() ,將兩個數(shù)字相乘:

  1. function multiply(num1, num2) { 
  2.   // 把你的代碼寫在這里... 

要求:

如果用 2 個參數(shù)調(diào)用 multiply(num1,numb2),則應返回這 2 個參數(shù)的乘積。

但是如果用 1個參數(shù)調(diào)用,則該函數(shù)應返回另一個函數(shù):const anotherFunc = multiply(num1) 。返回的函數(shù)在調(diào)用 anotherFunc(num2) 時執(zhí)行乘法 num1 * num2。

  1. multiply(4, 5); // => 20 
  2. multiply(3, 3); // => 9 
  3.  
  4. const double = multiply(2); 
  5. double(5);  // => 10 
  6. double(11); // => 22 

答案:

以下是 multiply() 函數(shù)的一種實現(xiàn)方式:

  1. function multiply(number1, number2) { 
  2.   if (number2 !== undefined) { 
  3.     return number1 * number2; 
  4.   } 
  5.   return function doMultiply(number2) { 
  6.     return number1 * number2; 
  7.   }; 
  8.  
  9. multiply(4, 5); // => 20 
  10. multiply(3, 3); // => 9 
  11.  
  12. const double = multiply(2); 
  13. double(5);  // => 10 
  14. double(11); // => 22 

如果 number2 參數(shù)不是 undefined,則該函數(shù)僅返回 number1 * number2。

但是,如果 number2 是 undefined,則意味著已經(jīng)使用一個參數(shù)調(diào)用了 multiply() 函數(shù)。這時就要返回一個函數(shù) doMultiply(),該函數(shù)稍后被調(diào)用時將執(zhí)行實際的乘法運算。

doMultiply() 是閉包,因為它從 multiply() 作用域中得到了number1 變量。

 

責任編輯:趙寧寧 來源: 前端先鋒
相關推薦

2021-03-04 09:35:54

thisJavaScript開發(fā)

2018-11-09 14:00:59

Python編程語言面試題

2021-06-29 10:21:54

this面試前端

2022-03-31 09:50:45

JS面試題

2017-11-06 13:02:37

前端setTimeout循環(huán)閉包

2021-05-08 14:20:27

Redis面試數(shù)據(jù)庫

2015-09-25 10:44:02

大數(shù)據(jù)Hadoop

2025-03-11 06:28:21

2021-03-10 08:04:11

this面試題JavaScript

2016-01-11 11:50:39

JavaScript閉包面試題

2023-02-04 18:24:10

SeataJava業(yè)務

2023-09-13 08:00:57

云原生Java開發(fā)者

2010-11-26 10:53:29

戴爾

2024-06-04 14:52:28

2025-10-17 10:00:00

運維Linux

2021-03-19 11:08:27

開發(fā)技能代碼

2022-04-08 07:52:17

CSS面試題HTML

2020-04-26 16:55:54

MySQL數(shù)據(jù)庫

2023-09-04 08:28:34

JavaScripforEach 循環(huán)

2015-09-02 14:09:19

面試題程序設計
點贊
收藏

51CTO技術(shù)棧公眾號

天堂av在线网站| 国产精品久久在线观看| 午夜男人的天堂| 女生影院久久| 综合网在线视频| 国产伦理久久久| 日本黄色中文字幕| 欧美三级在线| 亚洲视频在线播放| 91精品国产高清91久久久久久 | 欧美日韩a区| 日韩成人在线电影网| 婷婷免费在线观看| 男人天堂视频在线观看| 亚洲人成7777| 日韩精品久久一区二区三区| 丰满肉嫩西川结衣av| 免费在线观看一区二区三区| 久久免费视频在线观看| 99久久久无码国产精品不卡| 老司机在线精品视频| 欧美另类z0zxhd电影| 成人在线免费观看av| 色帝国亚洲欧美在线| 美日韩免费视频| a视频免费观看| 成人在线免费av| 婷婷激情综合网| 五月天综合婷婷| 成人影院免费观看| 久久午夜电影网| 国产伦精品一区二区三区视频孕妇| 中文字幕一区二区免费| 久久久久久久波多野高潮日日| 欧美成人免费小视频| 欧美xxxx精品| 综合干狼人综合首页| 亚洲成人av在线| 精品国产午夜福利在线观看| 国产成+人+综合+亚洲欧美| 午夜激情综合网| 欧美激情亚洲天堂| 国产精品实拍| 中文字幕中文字幕一区二区 | 国产乱码精品一区二三区蜜臂 | 红桃视频 国产| 日韩视频网站在线观看| 色婷婷亚洲综合| 欧美日韩黄色一级片| 丰满诱人av在线播放| 一区二区免费在线| 成年人视频大全| 日日夜夜天天综合入口| 亚洲精品日日夜夜| 中文字幕色呦呦| 污视频免费在线观看| 亚洲精品高清视频在线观看| 国产欧美综合一区| 欧美亚洲天堂| 亚洲444eee在线观看| 日韩精品 欧美| 伊人久久精品一区二区三区| 欧美午夜性色大片在线观看| 日日碰狠狠躁久久躁婷婷| 美女福利一区二区| 在线看国产一区二区| jizzzz日本| 欧美高清hd| 欧美精品一区二区三区在线| 国产精品久久无码| 国模精品一区| 日韩中文字幕视频在线| 色欲人妻综合网| 激情综合激情| 日韩免费在线视频| 在线视频 91| 国产精品亚洲一区二区三区在线| 97人人模人人爽人人喊38tv| 污污网站在线免费观看| 国产视频一区二区在线观看| 伊人久久青草| 久久久123| 欧美日韩美女视频| 9l视频白拍9色9l视频| 亚洲精品一区二区三区在线| 日韩精品在线免费观看视频| 日韩不卡av在线| 欧美女激情福利| 欧美在线观看日本一区| 国产精品无码久久av| 成人精品视频.| 亚洲国产精品视频一区| 在线āv视频| 欧美性猛交xxxx免费看漫画 | 福利一区在线观看| 欧美日韩系列| √天堂8在线网| 一本到三区不卡视频| 97人人爽人人| 日本成人7777| 欧美成年人网站| 男人天堂视频在线| 成人免费高清视频在线观看| 午夜欧美性电影| av手机免费在线观看| 欧美亚洲动漫精品| 欧美极品jizzhd欧美仙踪林| 色天天久久综合婷婷女18| 国内精品美女av在线播放| 一本色道久久综合精品婷婷| 99久久婷婷国产| 天天操天天干天天玩| 欧美电影免费观看| 亚洲国产精品va在线| 动漫性做爰视频| 奇米色777欧美一区二区| 国产一区免费| 怡红院在线观看| 欧美日韩国产电影| 一区二区不卡免费视频| 极品中文字幕一区| 成人午夜在线影院| av大片在线播放| 色婷婷久久综合| 国产xxxxxxxxx| 欧美韩日精品| 91精品中文在线| jyzzz在线观看视频| 欧美性精品220| 日韩av一二区| 99综合在线| 国产精品成人观看视频免费| 菠萝菠萝蜜在线观看| 欧美日韩国产首页| 东京热无码av男人的天堂| 男人的天堂亚洲| 久久影院理伦片| 天堂а√在线最新版中文在线| 精品日产卡一卡二卡麻豆| 一区二区成人免费视频| 精品一区二区三区视频| 亚洲一区精品视频| 亚洲老司机网| 久久久久99精品久久久久| 一级特黄aaa大片| 日本一区免费视频| 97公开免费视频| 国产一区网站| 国产精品久久久久久亚洲调教| 天堂av在线资源| 福利微拍一区二区| 蜜桃传媒一区二区亚洲av| 国产一区二区三区久久久久久久久| 激情五月综合色婷婷一区二区| 97蜜桃久久| 日韩精品在线免费观看| 无码人妻一区二区三区免费| 国产女主播一区| 涩涩网站在线看| 欧美1区3d| 精品伦精品一区二区三区视频| 成人黄色动漫| 亚洲午夜色婷婷在线| 瑟瑟视频在线免费观看| 亚洲人成影院在线观看| 欧美午夜精品一区二区| 妖精视频成人观看www| 欧美日韩国产综合在线| 久久久加勒比| 欧美日韩国产成人在线| 天堂中文在线看| 91国偷自产一区二区使用方法| 国产精品视频在| 国产精品99久久久久久似苏梦涵| 无码人妻精品一区二区蜜桃网站| 亚洲国产aⅴ精品一区二区| 91国产美女视频| av中文字幕在线| 日韩亚洲欧美在线观看| 亚洲另类欧美日韩| 国产精品灌醉下药二区| 欧美精品首页| 91在线中文字幕| 国产乱码在线| 亚洲欧美日韩天堂一区二区| 亚洲午夜精品久久久| 一区二区三区美女| 国精产品一区一区三区免费视频| 欧美aⅴ一区二区三区视频| 400部精品国偷自产在线观看| 卡通动漫精品一区二区三区| 国产精品免费视频xxxx| 人人澡人人添人人爽一区二区| 亚洲免费福利视频| 国产美女主播在线观看| 色综合天天视频在线观看| 欧美风情第一页| 99re66热这里只有精品3直播| 91人人澡人人爽人人精品| 韩日欧美一区| 一级做a爰片久久| 牲欧美videos精品| 97人人干人人| 亚洲黑人在线| 人体精品一二三区| 色婷婷在线播放| 日韩在线观看av| 九色蝌蚪在线| 亚洲国产精彩中文乱码av| 91久久精品无码一区二区| 色94色欧美sute亚洲13| 久久久久亚洲av成人片| 亚洲欧洲av色图| 人人妻人人澡人人爽| caoporm超碰国产精品| 一级做a爱视频| 久久国产综合精品| 激情婷婷综合网| 国产精品三上| www.av中文字幕| 欧美日本不卡高清| 中文字幕在线中文字幕日亚韩一区| 亚洲天堂日韩在线| 久久精品99| 黄色免费大全亚洲| www.成人三级视频| 日韩av综合| 亚洲伊人第一页| 99er精品视频| 成人性生交大片免费看小说 | 日韩精品免费一区二区在线观看 | 中国成人一区| 小说区视频区图片区| 色综合天天爱| 亚洲人一区二区| 日本不卡高清| 亚洲欧洲一区二区福利| 波多野结衣一区| 亚洲美女搞黄| 久久精品高清| 中文字幕在线观看一区二区三区| 久久精品国产99久久| 亚洲电影一二三区| 久久国产精品亚洲人一区二区三区 | 久久躁狠狠躁夜夜爽| 免费高清在线观看| 久久精品中文字幕免费mv| 麻豆影院在线观看| 欧美成人午夜激情在线| 在线三级电影| 久久久久久久999| 理论不卡电影大全神| 欧美一区二区.| 欧美日韩视频免费观看| 国产精品电影在线观看| 天天综合网站| 国产在线观看精品| 国产日韩中文在线中文字幕| av成人在线电影| 日韩成人午夜| 视频在线99| 亚洲欧美综合久久久| 被灌满精子的波多野结衣| 国产欧美大片| 在线观看的毛片| 狠狠色狠狠色综合| 亚洲少妇一区二区| 97久久久精品综合88久久| caopeng视频| 亚洲欧洲日产国码二区| 国产在线观看你懂的| 一本到不卡免费一区二区| 91尤物国产福利在线观看| 日韩美女一区二区三区四区| 香蕉久久一区二区三区| 在线观看国产精品91| 成人av黄色| 欧美野外猛男的大粗鳮| 国产一区二区色噜噜| 国产chinese精品一区二区| 伊人春色之综合网| 自拍偷拍亚洲色图欧美| 夜夜嗨一区二区| www.se五月| 99国产一区二区三精品乱码| 亚洲精品视频网址| 亚洲成a人v欧美综合天堂下载| 天干夜夜爽爽日日日日| 日韩一级精品视频在线观看| 免费在线黄色影片| 久久国产精品电影| 三级成人在线| 国产精品久久久久久久久久久久冷| 欧美日本成人| av网站大全免费| 麻豆成人久久精品二区三区小说| 老司机午夜免费福利| 国产精品午夜久久| 国产午夜精品一区二区理论影院| 日本道在线观看一区二区| 国产福利免费视频| 伊人一区二区三区久久精品 | 亚洲最大av| 欧美日韩亚洲一二三| 国产一区在线观看麻豆| asian性开放少妇pics| 亚洲乱码精品一二三四区日韩在线| 国产成人综合欧美精品久久| 欧美大片国产精品| 麻豆视频免费在线观看| 国产成人亚洲综合91| 99精品国产一区二区三区2021| 一区不卡字幕| 日韩—二三区免费观看av| 荫蒂被男人添免费视频| 一区二区三区免费看视频| 在线观看免费观看在线| 日韩精品中文字幕久久臀| 手机在线免费看av| 成人性生交xxxxx网站| 日韩激情图片| 日韩视频在线免费看| 99国产精品99久久久久久| 2021亚洲天堂| 91精品国产综合久久福利软件| 第九色区av在线| 国产成人精品一区二区在线| 久久精品凹凸全集| 国产精品裸体瑜伽视频| 国产不卡一区视频| 久久久久亚洲av片无码下载蜜桃| 欧美一区二区三区在线观看视频| 香蕉视频在线免费看| 国产精品福利网站| 精品美女久久| 欧美日韩亚洲一二三| 国产网站一区二区三区| 中文字幕在线观看视频免费| 亚洲欧洲一区二区三区在线观看| 中文字幕在线中文字幕在线中三区| 国产呦系列欧美呦日韩呦| 亚洲欧洲综合| 中文乱码人妻一区二区三区视频| 亚洲电影第三页| 天天操天天干天天干| 97在线精品国自产拍中文| 天堂一区二区三区四区| 国产极品粉嫩福利姬萌白酱| 91在线观看下载| 中文字幕一区二区人妻电影| 亚洲欧美精品中文字幕在线| 欧美影视资讯| 亚洲在线视频一区二区| 国产资源在线一区| 久久精品一级片| 亚洲国产精品成人一区二区| 欧美13videosex性极品| 日本不卡一区| 久久91精品久久久久久秒播| 欧美男女爱爱视频| 国产精品theporn| 性活交片大全免费看| 午夜电影网一区| 亚洲日本中文字幕在线| 欧美专区在线播放| 日韩国产综合| 黄页网站在线看| 亚洲va欧美va天堂v国产综合| 午夜av免费在线观看| 热草久综合在线| 日韩欧美字幕| 国产sm在线观看| 精品欧美激情精品一区| 女人偷人在线视频| 国产日韩在线播放| 欧美aa国产视频| 亚洲欧美色图视频| 欧美二区乱c少妇| sis001亚洲原创区| 日韩激情视频| 国产高清不卡一区| 国产三级精品三级在线观看| xxav国产精品美女主播| 韩国女主播一区二区三区| 老熟妇仑乱视频一区二区| 亚洲精品国产无套在线观| 免费动漫网站在线观看| 亚洲xxxx在线| 欧美一级播放| 欧美成人精品一区二区免费看片| 亚洲美女在线看| 中文字幕一区图| 伊人国产在线视频| 欧美日韩国产一区二区三区| 日本福利专区在线观看| 久久国产精品高清| 国产福利一区二区| 波多野结衣午夜| 97色在线视频| 外国成人免费视频|