例如: javascript
var n = 9999; function f1(){ alert(n); } f1();//9999
另一方面,在函數外部天然沒法讀取函數內部的局部變量。 java
function f1(){ var n = 99; } alert(n); //錯誤這裏有一個地方須要注意,函數內部聲明變量的時候,必定要使用var命令。若是不用的話,你實際上聲明瞭一個全局變量。
function f1(){ n =99; } f1(); alert(n); //99二.如何從外部讀取局部變量
fucntion f1(){ var n =99; function f2(){ alert(n); //99 } }在上面的代碼中,函數f2就被包括在函數f1內部,這時f1內部的全部局部變量,對f2都是可見的。可是反過來就不行,f2的局部變量對f1就是不見的。這就是js語言特有的鏈式做用域結構,子對象會一級一級地向上尋找全部父對象的變量。因此,父對象的全部變量,對子對象都是可見的,反之不成立。
function f1(){ var n=99; function f2(){ alert(n); } return f2; } var result = f1(); result(); //99三.閉包的概念
function f1(){ var n =99; nAdd = function(){n+=1;}; function f2(){ alert(n); } return f2; } var result = f1(); result(); nAdd(); result();在這段代碼中,result實際上就是閉包f2函數。它一共運行了兩次,第一次的值是99,第二次的值是1000,這證實了,函數f1中的局部變量一直保存在內存中,並無在f1調用後被自動清除。
2.閉包會在父函數外部,改變父函數內部變量的值,因此,若是你把父函數看成對象使用,把閉包看成它的公用方法,把內部變量看成它的私有屬性,這時必定要當心,不要隨便改變父函數內部變量的值。 閉包
總結:
閉包就是至關於java中一個類A中聲明另外一個類B,把類B當成類A的成員變量使用,而類B中的函數至關於類A的方法,類B中的屬性就是私有的,類A要用類B的屬性,就得聲明類B。 函數
1 一個函數是一個做用域。一個{}不是做用域。
2 爲了防止低層的子函數查找很是高層的父函數中變量,一般把高層做用域中的變量的一個引用,存放在子函數內部維護,提升效率。 性能