javascript閉包的我的理解

一、在函數內部聲明變量的時候必定要用var命令。若是不用的話,實際上聲明瞭一個全局變量。閉包

二、在JS中,對於變量,就是內部函數能夠一直向上尋找父對象變量,內部函數能夠訪問父函數定義的變量,但父函數不能訪問子函數變量。最簡單的理解就是兒子能夠要父親的,父親要不了兒子的。函數

三、閉包就是爲了解決上述問題的,將子函數做爲父函數的返回值,這樣就能夠在外部讀取內部變量了。對象

function f1(){內存

    var n=999;作用域

    nAdd=function(){n+=1}io

    function f2(){function

      alert(n);變量

    }術語

    return f2;作用域鏈

}

var result=f1();

result(); // 999

nAdd();

result(); // 1000

在這段代碼中,result實際上就是閉包f2函數。它一共運行了兩次,第一次的值是999,第二次的值是1000。這證實了,函數f1中的局部變量n一直保存在內存中,並無在f1調用後被自動清除。

四、函數體內部用var關鍵字定義變量,會對變量有個保護做用,這個保護的做用域限定在這個函數體內,也就是說,在這個函數體內訪問這個變量,是這個值,若是沒有var關鍵字,則定義並改變了變量的值。

function outerFun(){

var a =0;

alert(a); 

}

var a=4;

outerFun();

alert(a);

結果是 0,4 . 由於在函數內部使用了var關鍵字維護a的做用域在outFun()內部. 

再看下面的代碼: 

Js代碼 

function outerFun(){

//沒有var 

a =0;

alert(a); 

}

var a=4;

outerFun();

alert(a);

結果爲 0,0 真是奇怪,爲何呢? 

做用域鏈是描述一種路徑的術語,沿着該路徑能夠肯定變量的值.當執行a=0時,由於沒有使用var關鍵字,所以賦值操做會沿着做用域鏈到var a=4; 並改變其值.

相關文章
相關標籤/搜索