知乎:到底什麼是閉包?html
寸志:前端
JavaScript 閉包的本質源自兩點,詞法做用域和函數看成值傳遞。node
詞法做用域,就是,按照代碼書寫時的樣子,內部函數能夠訪問函數外面的變量。引擎經過數據結構和算法表示一個函數,使得在代碼解釋執行時按照詞法做用域的規則,能夠訪問外圍的變量,這些變量就登記在相應的數據結構中。面試
var x=23333; function test(){ alert(x); } test(); //彈出23333
函數看成值傳遞,即所謂的first class對象。就是能夠把函數看成一個值來賦值,看成參數傳給別的函數,也能夠把函數看成一個值 return。一個函數被看成值返回時,也就至關於返回了一個通道,這個通道能夠訪問這個函數詞法做用域中的變量,即函數所須要的數據結構保存了下來,數據結構中的值在外層函數執行時建立,外層函數執行完畢時理因銷燬,但因爲內部函數做爲值返回出去,這些值得以保存下來。並且沒法直接訪問,必須經過返回的函數。這也就是私有性。算法
function test(){ var x=23333; function test2(){ alert(x); } return test2; } test()();//彈出23333
原本執行過程和詞法做用域是封閉的,這種返回的函數就比如是一個蟲洞,開了掛。test2就是個閉包函數。顯然,閉包的造成很簡單,在執行過程完畢後,返回函數,或者將函數得以保留下來,即造成閉包。實際上在 JavaScript 代碼中閉包不要太常見。數據結構
函數做爲第一等對象以後 JavaScript 靈活得不要不要的。閉包
知乎:爲什麼前端面試官都喜歡問閉包?框架
niko:數據結構和算法
我一直這麼以爲,面試面的問題,並非單純的去回答一個答案,好比閉包這個問題來講,什麼是閉包,你們均可以巴拉巴拉說出來,可是從每一個人回答的方式,是能夠看出一些思考方式和思惟模式而且能夠按照這個深刻下去。ide
因此我以爲閉包是一個很好的面試問題,我就遇到過不少不少回答方式:
閉包就是一個函數內部能夠訪問函數外部的現象表述;
閉包就在於函數內部能夠直接讀取全局變量;
閉包是不少語言都具有的特性,在js中,閉包主要涉及到js的幾個其餘的特性:做用域鏈,垃圾(內存)回收機制,函數嵌套,等等,而後會跟你扯一堆;
還有的人說不清楚閉包是什麼,可是他們會要求直接給你寫代碼;
遇到些看起來水平很高的人,被問到閉包的時候每每很不削,通常就一句話的回答:是語言做用域的問題之類的
沒錯,前端都發展到如今這個階段了,再去問「閉包」,顯得有點「落後」,node、mv*框架、數據可視化、移動無線應用等等,如今前端該問的問題太多。
不過就算世界怎麼發展,閉包這個問題我以爲仍是能夠問的,能反映出思考方法和模式的問題就是好問題。
沒有low的問題,只有low的理解
沒有簡單的問題,只有簡單的認知
最看不慣遇到大神點讚的人,玉伯說什麼了就那麼多贊,追星麼大家是...