一、在函數內部聲明變量的時候必定要用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; 並改變其值.