標籤:

為何前端面試官都喜歡問閉包?

很多公司前端開發職位相關的面試官都喜歡問閉包。能否理解閉包可以當作評判一個前端開發的依據?


大致是這樣:

1,面試題以半開放問題為佳。閉包就是個半開放問題。所謂半開放,就是說你可以就你知道的隨便說,但是大致上有一些點面試官可以守著,看看你說的是否全面、準確。

2,這個問題可以追問。根據你的回答情況,面試官可以補充若干遞進問題。比如作用域,變數提升,引用傳遞,異常捕獲等等,涉及到的點還是比較多的。而且能追問不是顯得比較有面子嘛是吧?

3,這個問題是普適的。一方面它確實是個基礎問題,入口點完全是初級的,就算你經驗很少,也不應該一句答不出來。另一方面,它和平台的相關性比較小,也基本不隨著業界格局變化,較為穩定。像內存泄露他就不太好問,你來一句「這個話題過時了」咋整?

4,就 js 語言本身,它不像 C++ 一樣有著燦若繁星的特性。實際上真正適合面試的,可選擇的問題並不多,面試官也未必就有能力出更好的題目。而且 js 不像 java,在語言之上建立了層層公認的業務框架,js 連個標準庫都沒有。你面 java,問個 struts,spring,hadoop 什麼的,天經地義啊,可是面試官面 js 的時候,除了 jquery,還有什麼庫能安全提問呢?你問個 react,人家說沒用過,也天經地義啊。

5,最終形成的局面就是,「請解釋一下閉包」,「請問如何實現面向對象」,「請解釋一下this關鍵字」……


你都知道會問 還不會 就有點奇怪了。

我一般都問 for 100個按鈕 bind click 怎麼log對index。


什麼是閉包,回答多種多樣,對 JavaScript 理解層次的不同會有不一樣的答案。

有次面試官問我什麼是閉包,我按照我的理解回答了,他卻要我寫出一個閉包來…一個函數里返回一個函數…然後他滿意了…這種水平我基本是不會去的。


路過

隨便說幾句

可能這幾個因素

1、因為普遍具有實際用途

2、有著相對的有比較明確的答案

3、具有普遍認知度的問題,除了這幾個真是沒啥可問的

比如偶幾年前校招時候瀏覽器問過

元素的內聯事件處理函數的查找順序

就是 &

這個 a 函數是怎麼被瀏覽器找到的

是否所有實現查找都一致

沒人能答對啊

就連問題都得說幾次才能明白

說白了就是問的偏了

還不如問閉包來的直接呢

知道閉包的再問問使用場景

差不多能確定普通搬搬磚

不會給惹大麻煩什麼的了吧


我面試人從來不問閉包。

因為我認為閉包太簡單了,沒啥好問的。

更新,答 @niko :

問任何這類問題,總可以考察一些方面。但是面試的效率決定了你需要不斷找到更好的問題。怎麼樣是更好的問題,參見 @winter 的談談面試與面試題 · Issue #4 · wintercn/blog · GitHub 拿區分度、深度、覆蓋率來考察下「如何理解閉包」這個問題,跟其他問題比是不太理想的。


前端不懂閉包也能將就用各種框架開發,前端門檻本來就低,各種輪子也把很多工作傻瓜化了。

閉包能把只會用輪子的人篩下去。

作用域是JS里不多的需要理解的東西,其他的框架,函數,API什麼的就是個查文檔的事。

閉包說白了是個函數作用域的問題,作用域-引申到垃圾回收-循環依賴-內存泄漏-dom對象和JS對象的不同-this作用域-再到原型鏈-面向對象-甚至再到js引擎-瀏覽器內核。

能以閉包為切入點,把JS要的理解點,問個遍。

如果是一個多語言開發者,能引申更多的東西,比如不同語言的各種回收演算法,循環依賴,強弱引用,其他靜態語言支持閉包的也不少,部分靜態語言編譯器級的閉包實現。

閉包是很簡單,不為考技術,更為能檢驗一個人是不是真的對JS這種語言有興趣,是不是有求知慾和好奇心,是不是有基本的學習能力和理解能力,這些都是一個開發人員該有的基本素質。

能力經驗到了一定階段,都不是為了面技術,更是為了了解對開發工作的態度,學習理解的深度和溝通的感覺。

個人是先學靜態語言如c,java,後來接觸的JS,最開始實在難以理解JS的函數作用,其實沒有一點靜態語言基礎的反而更好理解。

終於搞明白的那一刻,深吸了口氣,那感覺真爽。


然而對於閉包最準確的描述應該是 @niko 答案裡面的一條:閉包就是一個函數內部可以訪問函數外部的現象表述。

可以做下:Learning Advanced JavaScript 這幾個例子,深入理解下。

至於那些 onclick 或者 setTimeout 的例子,簡直有些誤導,那些例子之所以能 OK 更多的是因為立即執行函數創建了一個個小作用域,將 i 傳遞到函數裡面的小作用域中,當調用起 onclick 的函數之後,會在小作用域裡面搜索。還有一個點就是往函數傳參的時候,是傳值的,而不是傳地址的。這個例子基本沒有表現出什麼閉包的特性,反而讓一些「新手」非常直觀的認為:閉包就是包裹一層立即執行函數。

建議 @劉洋 思考一下在 @小爝 評論里的 demo Edit fiddle - JSFiddle,去掉 arr[i].index 這行,在 onclick 裡面直接列印 i 為什麼不行?因為你的立即執行函數創建的作用域裡面,還是沒有 i 這個變數,結果 onclick 執行往上層作用域尋找 i 的時候,此時 i 為 10。


其實閉包是可以做為評判依據之一,但是我不會主動問。


因為他們無聊。

我一般都是問一些很實際的問題,但可以看出他們能否用到相關知識點,比如,

實現一個計算器API: Calculator().input(5).add(5).minus(3) = 7

實現一個搖骰子的函數:function roll(){} // 10% chance of 1, 2, 3, 4, 5, and 50% chance of 6

實現一個流水線函數:gulp.src(variable).pipe(fn1).pipe(fn2)...

等等。


其實吧。有些看似很傻的問題只是用來甄別要不要再問更深的問題的步驟。

好比那些背單詞的軟體,總要從易到難的。

一般都是從簡單的如padding, margin區別(CSS), alt和title的區別呀(html), ==和===的區別呀(js)

這樣開始的。閉包只是再向上一點點的台階。

好比,你寫了說你精通css3,然後不知道padding, margin的區別。我們還需要繼續下去嗎?

一般問三個簡單的,你都不知道,從統計學上,是吹牛的誤判的概率就很小了。

所以不知道閉包,或者知道不夠清楚並沒有關係。如果很多同級別的問題都不知道,就可以判斷你的知識的上限在哪裡了。


因為除了閉包,他們說不出幾個聽上去很牛逼的專業辭彙了


我也從來不問,除非候選人主動說自己會。


因為面試官覺得你不懂閉包就不是個好前端,其實有時候這個面試官也不懂,你說啥他就嗯嗯嗯,就下來就問this關鍵字。自從有了typescript還談什麼閉包,你說什麼閉包啊this指向問題什麼的作用域啊都不是問題了。


我一般是不回答問題的,一是覺得自己的回答問題的水平不夠,二是覺得已經有人回答的夠好了,不過在看了票數最高的兩位同學的( @賀師俊以及 @玉伯)的回答之後,感覺自己作為一個前端同學必須要站出來說兩句。

-------------重點,從這裡開始---------------

我一直這麼覺得,面試面的問題,並不是單純的去回答一個答案,比如閉包這個問題來說,什麼是閉包,大家都可以巴拉巴拉說出來,但是從每個人回答的方式,是可以看出一些思考方式和思維模式並且可以按照這個深入下去。

所以我覺得閉包是一個很好的面試問題,我就遇到過很多很多回答方式:

  • 閉包就是一個函數內部可以訪問函數外部的現象表述;

  • 閉包就在於函數內部可以直接讀取全局變數;

  • 閉包是很多語言都具備的特性,在js中,閉包主要涉及到js的幾個其他的特性:作用域鏈,垃圾(內存)回收機制,函數嵌套,等等,然後會跟你扯一堆;

  • 還有的人說不清楚閉包是什麼,但是他們會要求直接給你寫代碼;
  • 遇到些看起來水平很高的人,被問到閉包的時候往往很不削,一般就一句話的回答:是語言作用域的問題之類的

沒錯,前端都發展到現在這個階段了,再去問「閉包」,顯得有點「落後」,node、mv*框架、數據可視化、移動無線應用等等,現在前端該問的問題太多。

不過就算世界怎麼發展,閉包這個問題我覺得還是可以問的,能反映出思考方法和模式的問題就是好問題。

  • 沒有low的問題,只有low的理解
  • 沒有簡單的問題,只有簡單的認知
  • 最看不慣遇到大神點贊的人,玉伯說什麼了就那麼多贊,追星么你們是...


個人覺得閉包是js開發很基礎的一個知識點,如果連這個不會,我覺得接下去就不用問了。因為不懂閉包,你該怎麼去理解作用域,this的用法等等…就像人要生存下去,就要會吃東西喝水,如果連吃東西喝水都不會,那還怎麼生存下去~


Closure不說明你用JS很深,但他可以告訴面試官你用JS還不夠深。


看你面試的是什麼人吧。

就像賀老 @賀師俊說的,他從不面閉包,因為閉包太簡單,也因為他不需要那個level的工程師吧。

我也不問,不過和賀老不一樣,我不問是因為不會(劃掉)因為這個問題問爛了,簡直是必背面試題之一了。而且你知道怎麼說和真的了解在哪用怎麼用的更好,並沒有什麼關係。

要說基礎,比這個基礎的東西多得多~


目測以後面試 Java 都要問 lamba 了吧…


閉包可以扯出一堆js核心的東西啊:執行上下文,作用域鏈,this的綁定,arguments 對象,function對象, 絕對需要深入理解,才有可能真正掌握js。

當然會寫jq選擇器操作dom,會用函數式編程,也能完成日常絕大部分工作,但這只是算是初級的水平,很多css開發人員都有這個水平。


因為這是基礎


推薦閱讀:

如何通俗地解釋閉包的概念?

TAG:JavaScript | 閉包 |