本篇內(nèi)容主要講解“JavaScript中閉包的概念、原理及作用是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“JavaScript中閉包的概念、原理及作用是什么”吧!
創(chuàng)新互聯(lián)專注于萬州網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供萬州營銷型網(wǎng)站建設(shè),萬州網(wǎng)站制作、萬州網(wǎng)頁設(shè)計(jì)、萬州網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造萬州網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供萬州網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
一、閉包概念
閉包:有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù);一般情況就是在一個(gè)函數(shù)中包含另一個(gè)函數(shù)。
從官方定義我們知道閉包是一個(gè)函數(shù),只不過這個(gè)函數(shù)有[超能力],可以訪問到另一個(gè)函數(shù)的作用域。
為什么說這個(gè)叫做[超能力]呢?
因?yàn)槲覀冎篮瘮?shù)作用域是獨(dú)立的、封閉的,外部的執(zhí)行環(huán)境是訪問不了的,但是閉包具有這個(gè)能力和權(quán)限。
那閉包是怎樣的一個(gè)表現(xiàn)形式呢?
第一,閉包是一個(gè)函數(shù),而且存在于另一個(gè)函數(shù)當(dāng)中
第二,閉包可以訪問到父級(jí)函數(shù)的變量,且該變量不會(huì)銷毀
function person(){ var name = '有魚'; function cat(){ console.log(name); } return cat; } var per = person();// per的值就是return后的結(jié)果,即cat函數(shù) per();// 有魚 per()就相當(dāng)于cat() per();// 有魚 同上,而且變量name沒有銷毀,一直存在內(nèi)存中,供函數(shù)cat調(diào)用 per();// 有魚
二、閉包原理
閉包的實(shí)現(xiàn)原理,其實(shí)是利用了作用域鏈的特性,我們都知道作用域鏈就是在當(dāng)前執(zhí)行環(huán)境下訪問某個(gè)變量時(shí),如果不存在就一直向外層尋找,最終尋找到最外層也就是全局作用域,這樣就形成了一個(gè)鏈條。
例如:
var age = 18; function cat(){ age++; console.log(age);// cat函數(shù)內(nèi)輸出age,該作用域沒有,則向外層尋找,結(jié)果找到了,輸出[19]; } cat();//19
看到這里,大家都會(huì)說這不就是最簡單的函數(shù)和變量形式嗎?閉包在哪里?別急,我們接著往下看:
如果我們?cè)俅握{(diào)用時(shí),結(jié)果會(huì)一直增加,也就變量age的值一直遞增。
cat();//20 cat();//21 cat();//22
如果程序還有其他函數(shù),也需要用到age的值,則會(huì)受到影響,而且全局變量還容易被人修改,比較不安全,這就是全局變量容易污染的原因,所以我們必須解決變量污染問題,那就是把變量封裝到函數(shù)內(nèi),讓它成為局部變量。
function person(){ var age = 18; function cat(){ age++; console.log(age); } return cat; } person();// 19 person();// 19
這里又出現(xiàn)問題了,每次調(diào)用函數(shù)person,進(jìn)入該作用域,變量age就會(huì)重新賦值為18,所以cat的值一直是19;所以需要做一下調(diào)整:
var per = person();//per相當(dāng)于函數(shù)cat per();// 19 即cat() 這樣每次調(diào)用不在經(jīng)過age的初始值,這樣就可以一直增加了 per();// 20 per();// 21
而且變量age在函數(shù)內(nèi)部,不易修改和外泄,相對(duì)來說比較安全。
三、閉包作用
作用1:隱藏變量,避免全局污染
作用2:可以讀取函數(shù)內(nèi)部的變量
同時(shí)閉包使用不當(dāng),優(yōu)點(diǎn)就變成了缺點(diǎn):
缺點(diǎn)1:導(dǎo)致變量不會(huì)被垃圾回收機(jī)制回收,造成內(nèi)存消耗
缺點(diǎn)2:不恰當(dāng)?shù)氖褂瞄]包可能會(huì)造成內(nèi)存泄漏的問題
這里簡單說一下,為什么使用閉包時(shí)變量不會(huì)被垃圾回收機(jī)制收銷毀呢,這里需要了解一下JS垃圾回收機(jī)制;
JS規(guī)定在一個(gè)函數(shù)作用域內(nèi),程序執(zhí)行完以后變量就會(huì)被銷毀,這樣可節(jié)省內(nèi)存;使用閉包時(shí),按照作用域鏈的特點(diǎn),閉包(函數(shù))外面的變量不會(huì)被銷毀,因?yàn)楹瘮?shù)會(huì)一直被調(diào)用,所以一直存在,如果閉包使用過多會(huì)造成內(nèi)存銷毀。
四、閉包應(yīng)用
需求:實(shí)現(xiàn)變量a 自增
1、通過全局變量,可以實(shí)現(xiàn),但會(huì)污染其他程序
var a = 10; function Add(){ a++; console.log(a); } Add(); Add(); Add();
2、定義一個(gè)局部變量,不污染全局,但是實(shí)現(xiàn)不了遞增
var a = 10; function Add2(){ var a = 10; a++; console.log(a); } Add2(); Add2(); Add2(); console.log(a);
3、通過閉包,可以是函數(shù)內(nèi)部局部變量遞增,不會(huì)影響全部變量,完美!!
var a = 10; function Add3(){ var a = 10; return function(){ a++; return a; }; }; var cc = Add3(); console.log(cc()); console.log(cc()); console.log(cc()); console.log(a);
到此,相信大家對(duì)“JavaScript中閉包的概念、原理及作用是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!