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

首頁 > 編程 > JavaScript > 正文

理解javascript閉包

2019-11-20 11:00:59
字體:
來源:轉載
供稿:網友

什么是javascript閉包?
javascript允許使用內部函數,內部函數可以訪問它們所在的外部函數中聲明的所有局部變量、參數和聲明的其他內部函數。當其中一個這樣的內部函數在包含它們的外部函數之外被調用時,就會形成閉包。
簡單的javascript閉包例子:

<script>  function f1(){    var n=999;    nAdd=function(){n+=1}    function f2(){      alert(n);    }    return f2;  }  var result=f1();  result(); // 999  nAdd();  result(); // 1000</script>

在這段代碼中,result實際上就是閉包f2函數。它一共運行了兩次,第一次的值是999,第二次的值是1000。這證明了,函數f1中的局部變量n一直保存在內存中,并沒有在f1調用后被自動清除。
為什么會這樣呢?原因就在于f1是f2的父函數,而f2被賦給了一個全局變量,這導致f2始終在內存中,而f2的存在依賴于f1,因此f1也始終在內存中,不會在調用結束后,被垃圾回收機制(garbage collection)回收。
這段代碼中另一個值得注意的地方,就是"nAdd=function(){n+=1}"這一行,首先在nAdd前面沒有使用var關鍵字,因此nAdd是一個全局變量,而不是局部變量。其次,nAdd的值是一個匿名函數(anonymous function),而這個匿名函數本身也是一個閉包,所以nAdd相當于是一個setter,可以在函數外部對函數內部的局部變量進行操作。
 閉包的應用:

var singleton = function () {  var privateVariable;  function privateFunction(x) {    ...privateVariable...  }   return {    firstMethod: function (a, b) {      ...privateVariable...    },    secondMethod: function (c) {      ...privateFunction()...    }  };}();

 這個單件通過閉包來實現。通過閉包完成了私有的成員和方法的封裝。匿名主函數返回一個對象。對象包含了兩個方法,方法1可以方法私有變量,方法2訪問內部私有函數。需要注意的地方是匿名主函數結束的地方的'()',如果沒有這個'()'就不能產生單件。因為匿名函數只能返回了唯一的對象,而且不能被其他地方調用。這個就是利用閉包產生單件的方法。

閉包的優勢:
(1)不增加額外的全局變量,
(2)執行過程中所有變量都是在匿名函數內部。
閉包的缺點:
(1)由于閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。
(2)閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。

本文就為大家介紹這里,如果大家對javascript閉包還是不夠了解,請閱讀相關文章進行補充學習,謝謝大家的閱讀。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 密山市| 崇信县| 庆安县| 永济市| 申扎县| 大连市| 信阳市| 平阳县| 辽中县| 葫芦岛市| 清苑县| 和龙市| 中阳县| 常德市| 巩义市| 昌乐县| 泽州县| 通河县| 渝中区| 青海省| 吴堡县| 铁岭市| 永春县| 滁州市| 湾仔区| 连平县| 长泰县| 翁牛特旗| 保定市| 涞源县| 陆河县| 巴中市| 嘉义市| 永城市| 惠州市| 泾川县| 南部县| 鹤岗市| 百色市| 平顶山市| 大荔县|