閉包概念:
閉包就是有權(quán)訪問另一個(gè)函數(shù)作用域中變量的函數(shù).
分析這句話:
1.閉包是定義在函數(shù)中的函數(shù).
2.閉包能訪問包含函數(shù)的變量.
3.即使包含函數(shù)執(zhí)行完了, 被閉包引用的變量也得不到釋放.
例子分析-1: function add(){ var i = 0 arr = []; for(; i < 10; i++){ arr.push(function(){ alert(i); }); } return arr; } var temp = add(); temp[0](); 大家猜猜這個(gè)結(jié)果是多少? 0, i, 10? 我想大家會(huì)說是0. 但是結(jié)果是10. 我想大家想的應(yīng)該是這樣滴: i = 0, arr.push(function(){ alert(0); }) i = 1, arr.push(function(){ alert(1); }) ... i = 10, arr.push(function(){ alert(10); }) 咋一看, 這個(gè)確實(shí)合理, 根據(jù)閉包的定義, 具體這個(gè)當(dāng)然是上面分析的那樣了. 問題就出在這個(gè)變量的理解上. 1.i是變量不假, 但是i在for循環(huán)的時(shí)候, 一直在不斷變化. 也就是說這個(gè)i在參與for循環(huán)的時(shí)候, 值是不確定的, 等到for執(zhí)行完后, i的值才確定. 2.每次push一個(gè)匿名函數(shù)表達(dá)式時(shí), 那只是定義一個(gè)函數(shù), 并沒去執(zhí)行那個(gè)函數(shù), 所以那個(gè)函數(shù)里引用的外部變量都是原封不動(dòng)的放進(jìn)去的. 換句話說, 就是這個(gè)匿名函數(shù)在最后執(zhí)行的時(shí)候, 才會(huì)去查找作用域鏈, 直至找到那個(gè)變量i為止. 也就是: i = 0, arr.push(function(){ alert(i); }) i = 1, arr.push(function(){ alert(i); }) ... i = 10, arr.push(function(){ alert(i); }) 執(zhí)行add()時(shí), i參與循環(huán)完畢, i = 10. 執(zhí)行temp[0]()時(shí), 匿名函數(shù)會(huì)查找i, 先看自己, 我的i有值嗎?沒有. 再找他的上級函數(shù), i有值嗎?有, i = 10. 查找結(jié)束. 至此, 不管執(zhí)行temp[0](), 還是temp[5](), 還是temp[10](), 結(jié)果都是10. 改一下上面的例子, 讓它符合我們的預(yù)期要求. 例子分析-2: function add(){ var i = 0 arr = []; for(; i < 10; i++){ arr.push( (function(n){ return function(){ alert(n); } })(i)//注意這個(gè)變化 ); } return arr; } var temp = add(); temp[0](); temp[1](); ... 這次結(jié)果是預(yù)期的,結(jié)果是 0 , 1 , 2, 3 ... 10 分析一下循環(huán)那部分. (function(n){ return function(){ alert(n); } })(i) 這個(gè)叫做立即執(zhí)行的匿名函數(shù)表達(dá)式(不清楚這種寫法的, 可以先google下, 或者看我的多帶帶一篇專門介紹) i這個(gè)是時(shí)候就被當(dāng)做參數(shù)傳遞了, 每次這個(gè)匿名函數(shù)執(zhí)行時(shí), i都會(huì)把自己的值復(fù)制一份給n return語句中的匿名函數(shù)引用著n, 此時(shí)已經(jīng)和i無關(guān)了. 每次匿名函數(shù)表達(dá)式執(zhí)行時(shí), 都會(huì)保存一個(gè)不同的n. return語句中的匿名函數(shù)每次也引用著不同的n。 形象點(diǎn)就是這樣: arr.push( (function(n = i = 0){ return function(){ alert(n = 0); } })(i = 0) ) arr.push( (function(n = i = 1){ return function(){ alert(n = 1); } })(i = 1) ) ... 閉包的介紹就到此為止了.
轉(zhuǎn)自http://www.cnblogs.com/tinkbe...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82050.html
摘要:若時(shí)間差大于間隔時(shí)間,則立刻執(zhí)行一次函數(shù)。不同點(diǎn)函數(shù)防抖,在一段連續(xù)操作結(jié)束后,處理回調(diào),利用和實(shí)現(xiàn)。函數(shù)防抖關(guān)注一定時(shí)間連續(xù)觸發(fā)的事件只在最后執(zhí)行一次,而函數(shù)節(jié)流側(cè)重于一段時(shí)間內(nèi)只執(zhí)行一次。 原博客地址,歡迎star 函數(shù)防抖和節(jié)流 函數(shù)防抖和函數(shù)節(jié)流:優(yōu)化高頻率執(zhí)行js代碼的一種手段,js中的一些事件如瀏覽器的resize、scroll,鼠標(biāo)的mousemove、mouseover...
摘要:但,這還不是閉包。通過訪問外部變量,一個(gè)閉包可以維持這些變量。閉包經(jīng)常用于創(chuàng)建含有隱藏?cái)?shù)據(jù)的函數(shù)但并不總是這樣。有人說應(yīng)該在文章結(jié)尾對閉包進(jìn)行總結(jié),可惜小弟才疏學(xué)淺,不能給出一個(gè)精辟的總結(jié)。 越來越覺得國內(nèi)沒有教書育人的氛圍,為了弄懂JS的閉包,我使出了我英語四級吃奶的勁去google上搜尋著有關(guān)閉包的解釋,當(dāng)我看到stackoverflow上這一篇解答,我腦中就出現(xiàn)了一句話:就是這貨...
摘要:談起閉包,它可是兩個(gè)核心技術(shù)之一異步基于打造前端持續(xù)集成開發(fā)環(huán)境本文將以一個(gè)標(biāo)準(zhǔn)的項(xiàng)目為例,完全拋棄傳統(tǒng)的前端項(xiàng)目開發(fā)部署方式,基于容器技術(shù)打造一個(gè)精簡的前端持續(xù)集成的開發(fā)環(huán)境。 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果讀完本文還不懂,可以揍我。 不論你是javascript新手還是老鳥,不論是面試求職,還是日...
摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對方法,包括,,。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸?,因此文中只看懂?8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...
摘要:忍者級別的函數(shù)操作對于什么是匿名函數(shù),這里就不做過多介紹了。我們需要知道的是,對于而言,匿名函數(shù)是一個(gè)很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個(gè)供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎(chǔ), 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機(jī)制,如果...
閱讀 3793·2023-04-25 21:09
閱讀 3139·2021-10-20 13:48
閱讀 3052·2021-09-24 10:25
閱讀 2947·2021-08-21 14:08
閱讀 1804·2019-08-30 15:56
閱讀 993·2019-08-30 15:52
閱讀 1862·2019-08-29 14:11
閱讀 3578·2019-08-29 11:01