摘要:要理解閉包,首先必須理解特殊的變量作用域。使用閉包有一個(gè)優(yōu)點(diǎn),也是它的缺點(diǎn)就是可以把局部變量駐留在內(nèi)存中,可以避免使用全局變量。
js閉包
閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的常見的方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù),通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量。要理解閉包,首先必須理解Javascript特殊的變量作用域。變量的作用域無非就是兩種:全局變量和局部變量。Javascript語言的特殊之處,就在于函數(shù)內(nèi)部可以直接讀取全局變量。
出于種種原因,我們有時(shí)候需要得到函數(shù)內(nèi)的局部變量。但是,前面已經(jīng)說過了,正常情況下,這是辦不到的,只有通過變通方法才能實(shí)現(xiàn), 這種方法就是閉包。
function box() { var user = "Lee"; return function () { //通過匿名函數(shù)返回 box()局部變量 return user; }; } alert(box()()); //通過box()()來直接調(diào)用匿名函數(shù)返回值 var b = box(); alert(b());
閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的常見的方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù),通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量。。
使用閉包有一個(gè)優(yōu)點(diǎn),也是它的缺點(diǎn):就是可以把局部變量駐留在內(nèi)存中,可以避免使用全局變量。(全局變量污染導(dǎo)致應(yīng)用程序不可預(yù)測(cè)性,每個(gè)模塊都可調(diào)用必將引來災(zāi)難,所以推薦使用私有的,封裝的局部變量)
js閉包---var vs let有一個(gè)比較有意思的事情就是 ES6推出的let congst之后引發(fā)的一場(chǎng)血案, ^_^這場(chǎng)血案需要格外注意
下面來看兩段代碼, 其中唯一的區(qū)別就是 for 循環(huán)中 i 變量的關(guān)鍵字前者為 var 后者為 let, 兩者都是用了閉包的概念
function box() { var arr = []; for (let i = 0; i < 5; i++) { arr[i] = function () { return i; }; } return arr; } let b = box(); //得到函數(shù)數(shù)組 for (let i = 0; i < b.length; i++) { console.log(b[i]()); //輸出每個(gè)函數(shù)的值,都是最后一個(gè)值 } //運(yùn)行結(jié)果 // 0 // 1 // 2 // 3 // 4
function box() { let arr = []; for (let i = 0; i < 5; i++) { arr[i] = function () { return i; }; } return arr; } let b = box(); //得到函數(shù)數(shù)組 for (let i = 0; i < b.length; i++) { console.log(b[i]()); //輸出每個(gè)函數(shù)的值,都是最后一個(gè)值 } //運(yùn)行結(jié)果 // 0 // 1 // 2 // 3 // 4
這里設(shè)計(jì)了作用域的問題, 更涉及了 var 和 let 在 for 循環(huán)中條件表達(dá)式中的與其他高級(jí)語言的不同, 除了 var 不存在塊級(jí)作用域 let 存在代碼塊作用域這一說不加詳細(xì)介紹,最關(guān)鍵的是如果條件語句中用 let 則在每次循環(huán)的初期都會(huì)生成一個(gè)變量-(這與 c 語言, java 不同) ,而 var 只會(huì)在訪問初期調(diào)用一次生成一個(gè)變量, 這個(gè)是js最新出現(xiàn)的閉包相關(guān)的易錯(cuò)點(diǎn).
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107239.html
摘要:也許最好的理解是閉包總是在進(jìn)入某個(gè)函數(shù)的時(shí)候被創(chuàng)建,而局部變量是被加入到這個(gè)閉包中。在函數(shù)內(nèi)部的函數(shù)的內(nèi)部聲明函數(shù)是可以的可以獲得不止一個(gè)層級(jí)的閉包。 前言 總括 :這篇文章使用有效的javascript代碼向程序員們解釋了閉包,大牛和功能型程序員請(qǐng)自行忽略。 譯者 :文章寫在2006年,可直到翻譯的21小時(shí)之前作者還在完善這篇文章,在Stackoverflow的How do Java...
摘要:但是閉包也不是什么復(fù)雜到不可理解的東西,簡(jiǎn)而言之,閉包就是閉包就是函數(shù)的局部變量集合,只是這些局部變量在函數(shù)返回后會(huì)繼續(xù)存在??上У氖?,并沒有提供相關(guān)的成員和方法來訪問閉包中的局部變量。 (收藏自 技術(shù)狂) 前言:還是一篇入門文章。Javascript中有幾個(gè)非常重要的語言特性——對(duì)象、原型繼承、閉包。其中閉包 對(duì)于那些使用傳統(tǒng)靜態(tài)語言C/C++的程序員來說是一個(gè)新的語言特性。本文將...
摘要:當(dāng)在中調(diào)用匿名函數(shù)時(shí),它們用的都是同一個(gè)閉包,而且在這個(gè)閉包中使用了和的當(dāng)前值的值為因?yàn)檠h(huán)已經(jīng)結(jié)束,的值為。最好將閉包當(dāng)作是一個(gè)函數(shù)的入口創(chuàng)建的,而局部變量是被添加進(jìn)這個(gè)閉包的。 閉包不是魔法 這篇文章使用一些簡(jiǎn)單的代碼例子來解釋JavaScript閉包的概念,即使新手也可以輕松參透閉包的含義。 其實(shí)只要理解了核心概念,閉包并不是那么的難于理解。但是,網(wǎng)上充斥了太多學(xué)術(shù)性的文章,對(duì)于...
摘要:深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。定義對(duì)閉包的定義為閉包是指那些能夠訪問自由變量的函數(shù)。 JavaScript深入系列第八篇,介紹理論上的閉包和實(shí)踐上的閉包,以及從作用域鏈的角度解析經(jīng)典的閉包題。 定義 MDN 對(duì)閉包的定義為: 閉包是指那些能夠訪問自由變量的函數(shù)。 那什么是自由變量呢? 自由變量是指在函數(shù)中使用的,但既不是函數(shù)參數(shù)也...
摘要:一言以蔽之,閉包,你就得掌握。當(dāng)函數(shù)記住并訪問所在的詞法作用域,閉包就產(chǎn)生了。所以閉包才會(huì)得以實(shí)現(xiàn)。從技術(shù)上講,這就是閉包。執(zhí)行后,他的內(nèi)部作用域并不會(huì)消失,函數(shù)依然保持有作用域的閉包。 網(wǎng)上總結(jié)閉包的文章已經(jīng)爛大街了,不敢說筆者這篇文章多么多么xxx,只是個(gè)人理解總結(jié)。各位看官瞅瞅就好,大神還希望多多指正。此篇文章總結(jié)與《JavaScript忍者秘籍》 《你不知道的JavaScri...
摘要:但是,必須強(qiáng)調(diào),閉包是一個(gè)運(yùn)行期概念。通過原型鏈可以實(shí)現(xiàn)繼承,而與閉包相關(guān)的就是作用域鏈。常理來說,一個(gè)函數(shù)執(zhí)行完畢,其執(zhí)行環(huán)境的作用域鏈會(huì)被銷毀。所以此時(shí),的作用域鏈雖然銷毀了,但是其活動(dòng)對(duì)象仍在內(nèi)存中。 學(xué)習(xí)Javascript閉包(Closure)javascript的閉包JavaScript 閉包深入理解(closure)理解 Javascript 的閉包JavaScript ...
閱讀 2942·2021-11-24 09:39
閱讀 1197·2021-11-02 14:38
閱讀 4214·2021-09-10 11:26
閱讀 2785·2021-08-25 09:40
閱讀 2341·2019-08-30 15:54
閱讀 507·2019-08-30 10:56
閱讀 2799·2019-08-26 12:14
閱讀 3246·2019-08-26 12:13