摘要:例變量就是返回的函數(shù),執(zhí)行的時候變量并沒有消失,一直駐扎在內存中的,這時會彈出的這就是簡單的閉包形式。閉包的好處和應用好處希望一個變量長期駐扎在內存當中避免全局變量的污染是個全局變量,一直駐扎在內存中,依次執(zhí)行會累加。
主要分三部分說:
一、什么是閉包?二、閉包有什么好處?應用在哪里?
第一個特點:可以是函數(shù)嵌套函數(shù)
function fna(){ function fnb(){} }
第二個特點:內部函數(shù)可以引用外部函數(shù)的參數(shù)和變量
function fna(){ var b=5; function fnb(){ console.log(b); } fnb(); } fna();
b變量都要被內部函數(shù)fnb()引用到,會一直駐扎在內存中,不會被垃圾回收的,也就是說參數(shù)和變量不會被垃圾回收機制所收回。
那么什么是js垃圾回收機制呢?
function fna(){ var a=1; } fna();
例如,上面寫了個普通函數(shù)fna(),當fna();執(zhí)行完畢后變量a就不存在了,為了節(jié)省內存。
例1:
function fna(){ var a=5; function fnb(){ console.log(a); } return fnb; } var fnc=fna(); fnc(); //5
變量c就是返回的fnb函數(shù),fnc()執(zhí)行的時候 變量a并沒有消失,一直駐扎在內存中的,這時會彈出5的.這就是簡單的閉包形式。
2、閉包的好處和應用好處:
1.希望一個變量長期駐扎在內存當中
2.避免全局變量的污染
var a=1; function fna(){ a++; console.log(a); } fna(); //2 fna(); //3 console.log(a);//3
a是個全局變量,一直駐扎在內存中,依次執(zhí)行會累加。
function fna(){ var a=1; a++; console.log(a); } fna(); //2 fna(); //2
如果把變量a設置為局部變量,每調用一次代碼重新執(zhí)行,調用后a就不存在,下次調用的時候a還是1;那么怎么能做到a即是局部變量,a又能累計呢?
這就是閉包所能做到的。
例2:
function fna(){ var a=1; return function () { a++; console.log(a); }; } var fnb=fna(); fnb(); //2 fnb(); //3 console.log(a) //undfined
構成了函數(shù)嵌套函數(shù),當外面的函數(shù)執(zhí)行完畢后,內部函數(shù)依舊可以調用到變量a;
(function(){ console.log(1); })();
()放函數(shù),函數(shù)聲明就會變成函數(shù)表達式,再加()立即執(zhí)行。
至此可以把例2中的代碼改寫一下.
var fna= (function () { var a=1; return function () { a++; console.log(a); } })(); fna();//2 fna();//3
var a=1在外面是調用不到,減少全局變量的污染,把內部函數(shù)變?yōu)樗接械模?/p>
這也就是
3.變量私有
var aaa = (function(){ var a = 1; function bbb(){ a++; console.log(a); } function ccc(){ a++; console.log(a); } return { b : bbb, c : ccc } })(); //aaa.b(); //2 //aaa.c(); //3
在循環(huán)中直接找到對應元素的索引
Title
console.log(i)彈出3,為什么呢?很明顯,當循環(huán)執(zhí)行結束的時候
aLi[i].onclick = function(){ console.log(i);//3 };
還沒執(zhí)行,當點擊的時候才會執(zhí)行,但此時i已經(jīng)變成3了??梢岳瞄]包改寫,可以把循環(huán)中的i當作個參數(shù)傳進去,就之前所說的內部函數(shù)可以引用外部函數(shù)的參數(shù)和變量。
for(var i=0;i把i當成參數(shù)穿進去。除了這種寫法還有另外一種方式
for(var i=0;i
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/95065.html
摘要:閉包在我理解是一種比較抽象的東西。所以我寫了一篇博文來方便自己理解閉包。那么現(xiàn)在我們可以解釋一下閉包的第一個定義在計算機科學中,閉包是引用了自由變量的函數(shù)。循環(huán)中創(chuàng)建閉包在我們使用的關鍵字之前,閉包的一個常見問題就出現(xiàn)在循環(huán)中創(chuàng)建閉包。 零. 前言 從我開始接觸前端時就聽說過閉包,但是一直不理解閉包究竟是什么。上網(wǎng)看了各種博客,大家對閉包的說法不一。閉包在我理解是一種比較抽象的東西。所...
摘要:大多數(shù)非閉包的情況下,函數(shù)的外部函數(shù)即全局變量函數(shù)被調用時,也會創(chuàng)建一條作用域鏈下稱鏈,并將鏈的內容包含到鏈中,然后將當前函數(shù)的活動對象可以簡單理解為所有的內部變量添加到鏈條的頂端。 什么是閉包?閉包是指有權訪問另一個函數(shù)作用域中的變量的函數(shù)。---《JavaScript高級程序設計》通常來說,當一個函數(shù)可以訪問另一個函數(shù)內部定義的變量(包括屬性和方法)時,這個函數(shù)可以稱之為閉包: f...
摘要:譯者按在上一篇博客,我們通過實現(xiàn)一個計數(shù)器,了解了如何使用閉包,這篇博客將提供一些代碼示例,幫助大家理解閉包。然而,如果通過代碼示例去理解閉包,則簡單很多。不過,將閉包簡單地看做局部變量,理解起來會更加簡單。 - 譯者按: 在上一篇博客,我們通過實現(xiàn)一個計數(shù)器,了解了如何使用閉包(Closure),這篇博客將提供一些代碼示例,幫助大家理解閉包。 原文: JavaScript Clos...
摘要:從我年開始接觸前端,知道閉包這個詞,已經(jīng)過去兩年了。概念閉包,在高級程序設計里面是這樣介紹的閉包是指有權訪問另一個作用域中的變量的函數(shù)。這樣形成的閉包雖然可以使外部可以訪問到內部的函數(shù),但是導致了原有的作用域鏈不釋放,會造成內存泄漏。 從我16年開始接觸前端,知道閉包這個詞,已經(jīng)過去兩年了。這兩年里,閉包這個概念我在很多地方了解過,卻實在沒有真的理解,久而久之,變成了一塊心病。這不,趁...
摘要:閉包是函數(shù)內部的子函數(shù)能讀取局部變量二閉包的特點函數(shù)里面嵌套函數(shù)內部函數(shù)能訪問外部函數(shù)的變量定義的參數(shù)和變量不會回收三閉包的前提先明白什么是全局變量和局部變量中聲明變量格式關鍵字變量名標識符。建議在退出函數(shù)之前,將不使用的局部變量全部刪除。 一、閉包的概念 閉包是指一個函數(shù)能夠訪問其函數(shù)外部作用域中的變量。JavaScript閉包是函數(shù)內部的子函數(shù)能讀取局部變量 二、閉包的特點 函數(shù)...
閱讀 994·2021-11-23 09:51
閱讀 3487·2021-11-22 12:04
閱讀 2727·2021-11-11 16:55
閱讀 2955·2019-08-30 15:55
閱讀 3238·2019-08-29 14:22
閱讀 3361·2019-08-28 18:06
閱讀 1253·2019-08-26 18:36
閱讀 2138·2019-08-26 12:08