首先是一道前端經(jīng)典閉包面試題。
for(var i = 0;i<5;i++){
setTimeout(()=>{
console.log(i)
},1000*i)
}
這題大家都知道答案是每隔1秒打出5。
然后面試官讓改成每隔1秒輸出正確數(shù)字,你知道使用閉包:
function a(j){
setTimeout(()=>{
console.log(j)
},1000*j)
}
for(var i = 0;i<5;i++){
a(i)
}
但是這樣的做法只是使用函數(shù)作用域保存了i的值,讓定時器執(zhí)行回調(diào)時所找到的變量值是每次循環(huán)對應(yīng)的值,而閉包的作用是讓函數(shù)外部間接訪問到函數(shù)內(nèi)部的值。
所以簡單來說我覺得這道題不是閉包的作用,而僅僅是函數(shù)作用域的作用。
不知道我的理解對不對。
閉包是函數(shù)內(nèi)部有權(quán)訪問函數(shù)外部的變量,不是外部訪問內(nèi)部
首先看下完整版 破解前端面試(80% 應(yīng)聘者不及格系列):從 閉包說起
其實主要利用了基本類型在函數(shù)調(diào)用時,按值傳遞的,所以就能拿到不同時期 i 對應(yīng)的值,跟閉包沒多大關(guān)系。
一般這種套路讓你寫的是立即執(zhí)行函數(shù)表達式
,當(dāng)然更任性的會改成let。
for(var i = 0;i<5;i++){
(setTimeout((j)=>{
console.log(j)
},1000*j))(i)
}
閉包應(yīng)該是指的原題,setTimeout的callback引用了不屬于其作用域的變量i,i在原有的作用域上無法釋放。當(dāng)然,你也可以理解為所有的異步操作都是閉包。
你不知道的JavaScript中關(guān)于閉包的定義
當(dāng)函數(shù)可以記住并訪問所在的詞法作用域,即使函數(shù)是在當(dāng)前詞法作用域之外執(zhí)行,這時
就產(chǎn)生了閉包。-----你不知道的JavaScript
你回答的答案沒錯,但是作用域和閉包密切相關(guān),這里很容易覺得沒有閉包,但事實上這是關(guān)于詞法作用域的問題,以下兩段代碼,1在詞法作用域內(nèi),2在詞法作用域外。
function a(){
function b(){
}
}
function a(){
setTimeout(function b(){
},0);
}
你說對了……一半!
function a(j){
setTimeout(()=>{ // callback
console.log(j)
},1000*j)
}
for(var i = 0;i<5;i++){
a(i)
}
這是一個作用域問題,同時也是一個閉包問題。
關(guān)鍵點在于setTimeout
定時器所執(zhí)行的函數(shù)會脫離當(dāng)前的作用域,callback
函數(shù)并不是在a
函數(shù)的作用域中執(zhí)行的,其中的j
是a
中那個j
的閉包變量。
換句話說,如果沒有閉包,callback
函數(shù)中訪問到的將是undefined
(或報錯)。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。