摘要:溫馨提示作者的爬坑記錄,對你等大神完全沒有價值,別在我這浪費生命溫馨提示續本文將會成為一篇筆記類型的文章,記錄閉包具體的應用方式溫馨提示再續本文存在錯誤,會慢慢改進的,請不要把我說的當真在上一篇博文閉包不完全探索記錄閉包啥餡的中,對中
溫馨提示:作者的爬坑記錄,對你等大神完全沒有價值,別在我這浪費生命
溫馨提示-續:本文(maybe)將會成為一篇筆記類型的文章,記錄閉包具體的應用方式
溫馨提示-再續:本文(maybe)存在錯誤,會慢慢改進的,請不要把我說的當真
在上一篇博文 javascript閉包不完全探索記錄01:閉包?啥餡的?- lskrat 中,對javascript中閉包本身進行了研究和學習,并取得了一定的成果(知道了老王私房錢藏哪了)
接下來,按照面試官的思路,他不會問你一個沒有用的東西啊,閉包既然被廣泛的提及則必然(maybe)有其存在的價值和意義。
所以我不禁產生了疑問,這貨到底干啥的?閉包要是如此重要,為啥我能夠在不理解的情況下就干了這么多前端開發?
下面就(逐漸)慢慢列出來吧
獲取函數內部屬性在上文提到的博文中已經有所提及,因為javascript本身的作用域鏈特性,外部無法調用內部的屬性,所以當我們希望調用一個內部變量的時候(也不知道是什么時候)可以利用閉包來建立外部與函數內部的聯系,舉個例子
function testClosure(){ var innerInfo = "lskrat" return function(){ return innerInfo } } console.log(testClosure()())//lskrat
通過在外部調用testClosure的返回函數,成功的get到了他的內部屬性
保持變量的保存在緩存中這要從一個經典的誤會說起
function testClosure(){ var funcs = []; for(var i = 0 ; i < 5 ; i++){ funcs[i] = function(){ return i } } return funcs } console.log(testClosure()[0]())//5 console.log(testClosure()[1]())//5
乍看之下,可能會覺得上面的運行結果有問題,按照上文代碼的大概含義應該的到的結果應該是根據調取不同的返回函數得到不同的i值才對,可最終得到的都是5,顯然事情不是這么簡單的
我們來對console.log(testClosure()[0]())進行分析,看看這句話都干了什么,首先調用了testClosure()這個函數,函數內部的for循環開始工作,生成了一個由函數組成的數組funcs,這一步結束之后,for循環中的i就已經是5了,而且由于返回的funcs中調用了內部變量i,所以i=5就一直被存在了緩存之中沒有被釋放,此時再執行testClosure()[0]相當于調用了funcs[0],不過無論調用的是funcs中的哪一個函數,其實都是要返回i的值,而func[n]中的i并沒有在循環中被直接賦予循環時i對應的值,而只是一個變量的引用,這個引用就是那個被存在緩存之中的5,所以最后的結果就都是5了。
那我們怎樣才能讓這個代碼正常(按照我們的想法)呢?
上面的寫法之所以結果都是5主要是因為在構建函數func[n]的時候,所指向的i的值并沒有存在于一個閉包中,所以如果我們寫一個閉包呢,寫一個內部函數,調用i,將它的值封在一個閉包中,具體寫法如下
function testClosure(){ var func = [] function testInner(j){ func[j] = function(){ return j } } for(var i = 0 ; i < 5 ; i++){ testInner(i) } return func } console.log(testClosure()[4]());//4 console.log(testClosure()[2]());//2
為什么可以了?原因就在與這里出現的testInner函數提供了一個新的作用域及變量,在執行的過程中,每當生成一個func[n]與之對應的j都會因為作用域鏈的原因,連同其對應的值被“鎖住”與func[n]一起形成閉包,所以其中對應的i值就被保留了下來
之前沒用過很可能是我一直都在使用各種已經被各位大神封裝的很好的js庫了吧,從JQuery到Vue我欠原生js一個閉包
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90039.html
摘要:閉包一詞來源于以下兩者的結合要執行的代碼塊由于自由變量被包含在代碼塊中,這些自由變量以及它們引用的對象沒有被釋放和為自由變量提供綁定的計算環境作用域。在以及及以上等語言中都能找到對閉包不同程度的支持。 溫馨提示:作者的爬坑記錄,對你等大神完全沒有價值,別在我這浪費生命 閉包,好吃嗎 ? 第一次聽到這個詞,很不幸是在一次面試中,可想而知結果很細碎,從此閉包和跨域在我匱乏的前端知識中成為了...
溫馨提示:作者的爬坑記錄,對你等大神完全沒有價值,別在我這浪費生命 這一切,源于阮大神博文學習Javascript閉包(Closure)- 阮一峰中的一道思考題 //問題1: var name = The Window; var object = { name : My Object, getNameFunc : function(){ return function(){ ...
摘要:掛機科了次使用這個結構,匿名函數就有了自己的執行環境或閉包,然后我們立即執行。注意,匿名函數的圓括號是必需的,因為以關鍵字開頭的語句通常被認為是函數聲明請記住,中不能使用未命名的函數聲明。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 20 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可以在這里找到它們: ...
摘要:并且作用域鏈也確定了在當前上下文中查找標識符后返回的值。為了具象化分析問題,我們可以假設作用域鏈是一個數組,數組成員有一系列變量對象組成。注意,所有作用域鏈的最末端都為全局變量對象。所以作用域作用域鏈都是在當前運行環境內代碼執行前就確定了。 什么是作用域(Scope)? 作用域產生于程序源代碼中定義變量的區域,在程序編碼階段就確定了。javascript 中分為全局作用域(Global...
閱讀 1107·2021-11-23 09:51
閱讀 1074·2021-10-18 13:31
閱讀 2966·2021-09-22 16:06
閱讀 4256·2021-09-10 11:19
閱讀 2196·2019-08-29 17:04
閱讀 425·2019-08-29 10:55
閱讀 2472·2019-08-26 16:37
閱讀 3369·2019-08-26 13:29