js-閉包

了解閉包前,先了解變量:局部變量和全局變量。

var m = 100;
function f1(){
    console.log(m);
}
f1() // 100
//m為全局變量
function f2(){
    var n = 100;
}
f2();
console.log(n); //Uncaught ReferenceError: n is not defined
//n為局部變量
// ps:如果在函數(shù)里面,沒有用var,實際上是定義了一個全局變量。如下:
function f3(){
    j = 100;
}
f3();
console.log(j); //100
//j為全局變量

接下來的問題是,如何從外部獲取局部變量:

function f4(){
    var k = 100;
    function f5(){
        alert(k);
    }
    return f5;
}
f4()() //100

如上,f5可以讀取f4中的局部變量,那么只要把f5作為返回值,我們就可以在f4外部讀取它的內(nèi)部變量(k)。f5就是閉包。

閉包的用途 :
閉包可以用在許多地方。它的最大用處有兩個,一個是可以讀取函數(shù)內(nèi)部的變量,另一個就是讓這些變量的值始終保持在內(nèi)存中。
使用閉包的注意點:
1.由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,所以不能濫用閉包,否則會造成網(wǎng)頁的性能問題,在IE中可能導致內(nèi)存泄露(內(nèi)存泄漏是指程序中己動態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無法釋放,造成系統(tǒng)內(nèi)存的浪費,導致程序運行速度減慢甚至系統(tǒng)崩潰等嚴重后果。)。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。
2.閉包會在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。

注意:
閉包并不會引起內(nèi)存泄漏,只是由于IE9之前的版本對JScript對象和COM對象使用不同的垃圾收集,從而導致內(nèi)存無法進行回收,這是IE的問題,所以閉包和內(nèi)存泄漏沒半毛錢關系。具體看這篇文章

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現(xiàn)。 一、變量...
    zock閱讀 1,121評論 2 6
  • 閉包: 官方”的解釋是:閉包是一個擁有許多變量和綁定了這些變量的環(huán)境的表達式(通常是一個函數(shù)),因而這些變量也是該...
    小裁縫sun閱讀 715評論 0 5
  • 一、變量的作用域 要理解閉包,首先必須理解Javascript特殊的變量作用域。 變量的作用域無非就是兩種:全局變...
    紫陌蘭溪閱讀 313評論 0 4
  • 一、變量的作用域要理解閉包,首先必須理解Javascript特殊的變量作用域。變量的作用域無非就是兩種:全局變量和...
    Bigbang_boy閱讀 213評論 0 0
  • 在線全職這個模式就是用可靠的平臺把設計師和雇主聯(lián)系在一起,讓雇主可以安心雇傭設計師,讓設計師可以安心求職工作!設計...
    f1885e183ef3閱讀 744評論 0 0

友情鏈接更多精彩內(nèi)容