閉包概念:
閉包就是有權(quán)訪問另一個函數(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](); 大家猜猜這個結(jié)果是多少? 0, i, 10? 我想大家會說是0. 但是結(jié)果是10. 我想大家想的應該是這樣滴: i = 0, arr.push(function(){ alert(0); }) i = 1, arr.push(function(){ alert(1); }) ... i = 10, arr.push(function(){ alert(10); }) 咋一看, 這個確實合理, 根據(jù)閉包的定義, 具體這個當然是上面分析的那樣了. 問題就出在這個變量的理解上. 1.i是變量不假, 但是i在for循環(huán)的時候, 一直在不斷變化. 也就是說這個i在參與for循環(huán)的時候, 值是不確定的, 等到for執(zhí)行完后, i的值才確定. 2.每次push一個匿名函數(shù)表達式時, 那只是定義一個函數(shù), 并沒去執(zhí)行那個函數(shù), 所以那個函數(shù)里引用的外部變量都是原封不動的放進去的. 換句話說, 就是這個匿名函數(shù)在最后執(zhí)行的時候, 才會去查找作用域鏈, 直至找到那個變量i為止. 也就是: i = 0, arr.push(function(){ alert(i); }) i = 1, arr.push(function(){ alert(i); }) ... i = 10, arr.push(function(){ alert(i); }) 執(zhí)行add()時, i參與循環(huán)完畢, i = 10. 執(zhí)行temp[0]()時, 匿名函數(shù)會查找i, 先看自己, 我的i有值嗎?沒有. 再找他的上級函數(shù), i有值嗎?有, i = 10. 查找結(jié)束. 至此, 不管執(zhí)行temp[0](), 還是temp[5](), 還是temp[10](), 結(jié)果都是10. 改一下上面的例子, 讓它符合我們的預期要求. 例子分析-2: function add(){ var i = 0 arr = []; for(; i < 10; i++){ arr.push( (function(n){ return function(){ alert(n); } })(i)//注意這個變化 ); } return arr; } var temp = add(); temp[0](); temp[1](); ... 這次結(jié)果是預期的,結(jié)果是 0 , 1 , 2, 3 ... 10 分析一下循環(huán)那部分. (function(n){ return function(){ alert(n); } })(i) 這個叫做立即執(zhí)行的匿名函數(shù)表達式(不清楚這種寫法的, 可以先google下, 或者看我的多帶帶一篇專門介紹) i這個是時候就被當做參數(shù)傳遞了, 每次這個匿名函數(shù)執(zhí)行時, i都會把自己的值復制一份給n return語句中的匿名函數(shù)引用著n, 此時已經(jīng)和i無關(guān)了. 每次匿名函數(shù)表達式執(zhí)行時, 都會保存一個不同的n. return語句中的匿名函數(shù)每次也引用著不同的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://specialneedsforspecialkids.com/yun/82050.html
摘要:若時間差大于間隔時間,則立刻執(zhí)行一次函數(shù)。不同點函數(shù)防抖,在一段連續(xù)操作結(jié)束后,處理回調(diào),利用和實現(xiàn)。函數(shù)防抖關(guān)注一定時間連續(xù)觸發(fā)的事件只在最后執(zhí)行一次,而函數(shù)節(jié)流側(cè)重于一段時間內(nèi)只執(zhí)行一次。 原博客地址,歡迎star 函數(shù)防抖和節(jié)流 函數(shù)防抖和函數(shù)節(jié)流:優(yōu)化高頻率執(zhí)行js代碼的一種手段,js中的一些事件如瀏覽器的resize、scroll,鼠標的mousemove、mouseover...
摘要:理解的函數(shù)基礎要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當作缺點提及,但是只要善于運用,其實基于原型的繼承模型比傳統(tǒng)的類繼承還要強大。中文指南基本操作指南二繼續(xù)熟悉的幾對方法,包括,,。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。 怎樣使用 this 因為本人屬于偽前端,因此文中只看懂了 8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...
摘要:忍者級別的函數(shù)操作對于什么是匿名函數(shù),這里就不做過多介紹了。我們需要知道的是,對于而言,匿名函數(shù)是一個很重要且具有邏輯性的特性。通常,匿名函數(shù)的使用情況是創(chuàng)建一個供以后使用的函數(shù)。 JS 中的遞歸 遞歸, 遞歸基礎, 斐波那契數(shù)列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執(zhí)行機制 本文的目的就是要保證你徹底弄懂javascript的執(zhí)行機制,如果...
閱讀 3780·2023-04-25 21:09
閱讀 3129·2021-10-20 13:48
閱讀 2956·2021-09-24 10:25
閱讀 2937·2021-08-21 14:08
閱讀 1795·2019-08-30 15:56
閱讀 982·2019-08-30 15:52
閱讀 1848·2019-08-29 14:11
閱讀 3568·2019-08-29 11:01