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