精品欧美一区二区三区在线观看 _久久久久国色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| 亚洲欧美一区二区三区四区五区| 日韩一级淫片| 精品美女国产在线| 五月天色一区| www.国产麻豆| 免费日韩av片| 中文字幕在线成人| 亚洲AV成人精品| 日韩电影网站| 亚洲欧美色图小说| 精品视频第一区| 亚洲无码精品在线播放| 欧美高清日韩| 亚洲精品一区在线观看香蕉 | 欧美96一区二区免费视频| 爱福利视频一区| 西西大胆午夜视频| 美女视频一区| 香蕉乱码成人久久天堂爱免费| 久久日韩精品| 国产老妇伦国产熟女老妇视频| 天天天综合网| 亚洲精品一区中文| 亚洲一级片免费观看| 91久久国产综合久久91猫猫| 亚洲欧美日韩人成在线播放| 另类欧美小说| 一级黄色片网站| 国产精品视区| 欧美另类xxx| 天天舔天天操天天干| 风间由美一区二区av101| 欧美三区在线观看| 人人妻人人澡人人爽欧美一区双| 午夜在线小视频| 99这里只有精品| 91麻豆国产语对白在线观看| 国产99免费视频| 亚洲毛片在线| 欧美国产中文字幕| 特黄一区二区三区| 欧美女优在线视频| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 91麻豆精品激情在线观看最新| 色呦呦网站一区| 欧美在线一区视频| 好吊日视频在线观看| 国产性天天综合网| 久久久久久久久久久久久久一区 | 欧美日韩不卡一区二区| 各处沟厕大尺度偷拍女厕嘘嘘| 国产一二区在线| 国产精品日韩成人| 日韩av电影免费播放| 网站黄在线观看| 懂色av一区二区三区免费看| 91精品视频免费看| 一级黄色片网站| 蜜芽一区二区三区| 国产精品视频免费在线观看| 国产乱码77777777| 日韩精品电影在线| 国产精品99久久久久久人| 天堂а√在线中文在线新版| 香蕉久久夜色精品国产| 久久久久久网站| av资源吧首页| 99热精品在线观看| 午夜精品在线视频| 天天操天天干视频| 免费视频一区| 日韩av色在线| 亚洲男人天堂网址| 日本成人在线不卡视频| 国产精品视频999| 91精东传媒理伦片在线观看| 精品一区二区三区免费观看| 91免费国产网站| 国产v片在线观看| 成人一区二区三区视频在线观看| 国产免费一区二区三区| 视频国产一区二区三区| 久久久久一区二区三区四区| 日韩免费三级| caoporn免费在线| 亚洲一区二区四区蜜桃| 欧美黑人经典片免费观看| 91九色国产在线播放| 欧美日韩国产在线播放| 精品久久久久久久无码| av在线播放一区二区| 精品国内片67194| 北岛玲一区二区| 精品免费av| 欧美成人免费播放| 五月天综合激情网| 免费精品视频在线| 99久热re在线精品996热视频| a级片在线播放| 9人人澡人人爽人人精品| 先锋影音网一区| 2024最新电影免费在线观看| 亚洲香肠在线观看| 别急慢慢来1978如如2| 日本精品视频| 国产午夜精品麻豆| www.超碰在线观看| 视频一区二区中文字幕| 亚洲伊人第一页| 久青草国产在线| 玉米视频成人免费看| 日韩国产一级片| 欧美黄色网络| 欧美一区二区日韩一区二区| 波多野在线播放| 日韩欧美精品| 97免费视频在线| 91九色蝌蚪91por成人| 91在线观看污| 亚洲小视频在线播放| 欧美艳星kaydenkross| 精品日韩欧美在线| eeuss中文字幕| 亚洲一区二区网站| 99国产在线视频| 最新真实国产在线视频| 欧美日韩一二三四五区| 女教师高潮黄又色视频| 日本不卡高清| 5278欧美一区二区三区| 国产高清在线观看视频| 亚洲欧洲av在线| 狠狠爱免费视频| 国产精品调教| 精品国偷自产在线视频99| 日韩欧美在线观看免费| 成人18视频日本| 久久久久亚洲av无码专区喷水| 国产精品亚洲一区二区三区在线观看| 精品国产污污免费网站入口| 日本免费网站视频| 日韩电影一区二区三区四区| 精品乱子伦一区二区三区| av毛片在线看| 日韩午夜中文字幕| 九九这里只有精品视频| 久久国产夜色精品鲁鲁99| 欧美在线播放一区二区| 在线能看的av网址| 日韩成人免费视频| 国产在线视频第一页| 国产福利一区二区三区| 91视频成人免费| 日韩成人精品一区二区三区| 亚洲视频综合网| 国产一区二区视频免费| 91蝌蚪国产九色| 91av资源网| 亚洲成a人片77777在线播放| 69av成年福利视频| 人妻一区二区三区四区| 亚洲一区二区三区三| 图片区偷拍区小说区| 好吊视频一区二区三区四区| 99精品国产高清一区二区| aaa大片在线观看| 日韩视频一区二区三区在线播放| 一区二区三区四区五区| 麻豆成人91精品二区三区| 亚洲精品在线视频观看| 亚洲免费资源| 日韩亚洲成人av在线| 亚洲综合精品视频| 亚洲日本va在线观看| 小日子的在线观看免费第8集| 日本一二区不卡| 91在线观看免费高清| caopen在线视频| 精品久久人人做人人爱| 91国产丝袜播放在线| 久久―日本道色综合久久| 一本色道无码道dvd在线观看| 欧美系列一区| 美女黄页在线观看| 国产精品色眯眯| 午夜免费看毛片| 欧美在线高清| 国产在线一区二| 丝袜美腿一区| 色综合伊人色综合网站| 亚洲bt天天射| 成人激情电影在线看| 欧美日韩午夜影院| 免费在线观看av网址| www激情久久| 超碰在线97免费| 亚洲蜜桃视频| 精品国产一区二区三区麻豆小说| 日本成人伦理电影| 美女精品视频一区| 四虎在线免费观看| 日本精品视频一区二区| 国产在线免费看| 成人免费观看视频| 男人操女人免费软件| 久久精品不卡| 精选一区二区三区四区五区| 国产精品诱惑| 97精品在线观看| 免费a级在线播放| 亚洲国产精品久久| 中文字幕自拍偷拍| 五月激情丁香一区二区三区| 日本在线观看网址| 成人av资源网站| 国产精品视频中文字幕| 欧美日韩蜜桃| 亚洲图片欧洲图片日韩av| 欧美变态挠脚心| 91免费综合在线| 亚洲高清黄色| 国a精品视频大全| 亚洲无线一线二线三线区别av| 久久久久久尹人网香蕉| 天堂v视频永久在线播放| 欧美日本韩国一区| 啦啦啦免费高清视频在线观看| 一区在线观看视频| 粉嫩av蜜桃av蜜臀av| 九一九一国产精品| 日韩亚洲在线视频| 亚洲精品精选| 黄色一级片av| 欧美综合一区| 欧美日韩精品免费看| 国产精品美女久久久久| 国产精品久久久久9999| 成人性生活av| 热久久这里只有| 欧美6一10sex性hd| 美女少妇精品视频| 四虎影视成人| 欧美精品激情在线| 爱啪视频在线观看视频免费| 性欧美xxxx| 中文日产幕无线码一区二区| 欧美一级大片在线观看| 成人小电影网站| 国产精品亚洲综合天堂夜夜| 久久久久久一区二区三区四区别墅| 国产精品日韩电影| 日韩一区二区三区四区五区| 91视频免费在线| 精品视频在线播放一区二区三区 | 日韩一区二区三免费高清在线观看| 国产精品一区二区性色av| 亚洲毛片在线免费| 成人自拍视频网站| 欧美高清视频看片在线观看| 日本不卡一区二区三区在线观看| 国产探花在线精品| 一区二区三区国产福利| 午夜精品久久| 欧美三级一级片| 久久精品国产亚洲aⅴ| 91视频福利网| 91亚洲男人天堂| 欧洲性xxxx| 亚洲精品视频在线观看免费| 日韩av电影网址| 色婷婷亚洲综合| 99精品视频免费看| 日韩激情视频在线| 3d成人动漫在线| 国内久久久精品| 日本中文字幕一区二区| 91免费观看| 伊人久久大香线蕉av不卡| 黄污视频在线观看| 俺去了亚洲欧美日韩| 激情网站在线| 国产999精品| 伊人久久大香线蕉综合影院首页| 国产精品一区而去| 日本不卡高清| 欧美视频在线观看网站| 久久精品国产亚洲高清剧情介绍| 在线免费看黄色片| 国产精品毛片久久久久久| 日本高清www免费视频| 91精品欧美综合在线观看最新| 日韩私人影院| 免费成人高清视频| 亚洲mmav| 精品欧美国产| 欧美女人交a| www.涩涩涩| 91美女在线观看| 国产一级片免费| 7878成人国产在线观看| 免费在线稳定资源站| 欧美精品久久久久a| 亚洲精品777| 日韩免费av电影| 久久av一区二区三区| 亚洲v在线观看| 亚洲视频免费看| 97人妻精品视频一区| 亚洲黄色免费三级| 国内老司机av在线| 91精品国产99久久久久久红楼| 精品盗摄女厕tp美女嘘嘘| 奇米精品一区二区三区| 高清不卡一二三区| 免费成年人视频在线观看| 欧美视频你懂的| 成年人视频在线观看免费| 欧洲精品毛片网站| 欧美日日夜夜| 成年女人18级毛片毛片免费| 国产成人在线看| 国产十六处破外女视频| 91精品欧美福利在线观看| 午夜精品一区| 国产精品入口福利| 日韩电影在线视频| 国产精品一区二区羞羞答答| 久久精品综合网| 五月婷婷激情视频| 精品无人区乱码1区2区3区在线| 动漫一区二区| 国产欧美在线一区二区| 欧美日韩理论| 在线观看亚洲免费视频| 亚洲国产你懂的| 天堂av在线免费| 午夜精品久久久99热福利| 成人av动漫| av免费观看国产| 91论坛在线播放| 欧美一区免费看| 国产一区二区三区毛片| 成人国产精品入口免费视频| 亚洲免费在线精品一区| 久久精品国产亚洲一区二区三区| 免费看特级毛片| 欧美一区二区福利视频| 亚洲h片在线看| 国产免费一区二区三区| 国产欧美91| 人妻av无码一区二区三区 | 在线观看日韩一区二区| 日韩在线视频观看| 91国内精品| 日韩少妇内射免费播放18禁裸乳| 国产日韩亚洲欧美综合| 在线观看视频二区| 九九九久久久久久| 欧美尿孔扩张虐视频| 日本999视频| 亚洲欧洲99久久| 欧美自拍偷拍第一页| 日产日韩在线亚洲欧美| 爽成人777777婷婷| 97中文字幕在线观看| 色欧美乱欧美15图片| 免费在线观看av| 国内一区二区三区在线视频| 久久欧美肥婆一二区| 欧美色图亚洲视频| 日韩电影大全免费观看2023年上| 欧美三级精品| 日韩欧美视频免费在线观看| 久久久久久99精品| av中文字幕免费| 国产xxx69麻豆国语对白| 欧美韩日高清| 中出视频在线观看| 欧美日本一区二区在线观看| 韩国成人免费视频| 亚洲激情啪啪| 99久久99久久精品国产片果冻| 在线观看国产区| 欧美国产日本在线| 红桃视频在线观看一区二区| a级大片免费看| 91黄色小视频| 久久不射影院| 亚洲精品乱码久久久久久蜜桃91| 成人一区二区三区视频 | 亚洲成年网站在线观看| 成人涩涩视频| 男人用嘴添女人下身免费视频| 中文字幕一区不卡|