国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

javascript中的閉包概念與用法實踐分析

2024-05-06 15:36:36
字體:
來源:轉載
供稿:網友

本文實例講述了javascript中的閉包概念與用法。分享給大家供大家參考,具體如下:

閉包的概念:閉包是指有權訪問另一個函數作用域中的變量的函數 (引自《javascript高級程序設計第三版》178頁)。閉包的優點是不會產生全局變量,避免變量污染問題,但是閉包也有一個缺點就是閉包攜帶包含它的函數作用域會比其它函數占用更多的內存,過度使用會導致內存占用過多。

wiki上關于閉包的概念:

In programming languages, closures (also lexical closures or function closures) are techniques for implementing lexically scoped name binding in languages with first-class functions. Operationally, a closure is a record storing a function[a] together with an environment:[1] a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or reference to which the name was bound when the closure was created.[b] A closure—unlike a plain function—allows the function to access those captured variables through the closure's copies of their values or references, even when the function is invoked outside their scope.

簡單來說:閉包是一個存儲了函數以及與這個函數相關的環境信息的記錄。

閉包實踐一:初次體驗閉包

function a() { var temp = 100; function b() {  console.log(++temp); } return b;}var fn = a(); // 此時fn屬于全局的函數。fn();// 101fn();// 102

在函數a的內部return出了一個局部函數b。讓函數fn接收函數a的返回值,也就是函數b。連續執行了兩次fn,輸出結果101,,102表示,函數fn一直引用著函數a中的局部變量temp。每次調用fn,temp都會被自增1。從此處說明了函數a一直沒有被垃圾回收機制(GC)回收。以上代碼還可以這樣優化:

function a() { var temp = 100; return function() {  console.log(++temp); }}var fn = a();a = null;fn();// 101fn();// 102fn = null; // 調用完畢后要,要解除對內部匿名函數的引用,以便釋放內存

閉包實踐二:閉包與變量

分析下面的代碼

html結構:

<ul> <li>0</li> <li>1</li> <li>2</li></ul>

javascript結構:

var ul = document.querySelector('ul');// 為了演示方便,直接用html5的apivar lis = ul.children;for(var i=0; i< lis.length; i++) { lis[i].οnclick=function(){  console.log(i); }}

當點擊每個li時,輸出的全都是3,在點擊事件之前,for循環早已經執行完了,i的值為3。為了防止這種情況發生,for循環還可以修改成這樣:

for(var i=0; i< lis.length; i++) { lis[i].οnclick=function(num){  return function(){   console.log(num);  } }(i)}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 榆林市| 丹棱县| 滁州市| 唐山市| 淮南市| 永定县| 龙游县| 蒙自县| 韶关市| 松桃| 龙泉市| 沙洋县| 屯门区| 鄂州市| 乐业县| 社会| 福州市| 伊通| 康平县| 彰化县| 吉木萨尔县| 都江堰市| 石嘴山市| 蓝田县| 河西区| 平乐县| 宁河县| 安徽省| 云霄县| 伊通| 房产| 财经| 贞丰县| 久治县| 长治市| 阜南县| 周至县| 洪湖市| 无极县| 和龙市| 莎车县|