作為一個后台開發人員了解前端非常重要,尤其是深處學校實驗室做項目時前端把寫好的代碼直接給你,然后你在修改的時候。我經常做的就是修改前端的代碼的HTML和后台交互的部分以及js的ajax部分,之后修改之后也會遇到很多問題,所以只能自己繼續修改前端,學習了前端的不少知識。
js的閉包是一個很重要的概念,在編寫js代碼中經常會被用到的,也是js的特色以及難點。
知道閉包首先得知道js的變量和作用域。
在js中變量不向C/C++/Java中那樣,得先定義在使用,js中可以直接使用變量,比如:
1 n=100;
當然還有一種方式就是:
1 num1=10; 2 var num2=15;
這兩種方式在平時這種情況下看不出來其不同,但是一旦牽扯到了全局變量和局部變量之后就會看到不同之處,js的特殊之處就在於函數內部可以直接讀取全局變量:
1 var num=10; 2 function readNum(){ 3 alert(num); 4 } 5 readNum();
以上代碼可以輸出的結果是10,這一點很簡單,因為num是全局變量,所以函數可以直接訪問。那么函數外部當然就無法訪問局部變量:
1 function readNum(){ 2 var num=10; 3 } 4 alert(num);
很顯然這一句會出錯。那么在內部定義的時候如果這樣定義:
1 function readNum(){ 2 num=10; 3 } 4 alert(num);
這樣的代碼就不會出錯了,因為在js中使用var修飾的變量是局部的,在函數中不能有外部訪問,然而沒有使用var修飾的變量是全局的,所有的變量都能訪問,那么問題來了,既然外部不能訪問用var修飾的局部變量,但是一旦我們有時候需要訪問的時候我們怎么辦呢?想到的第一個方法就是在函數內部在定義一個函數:
1
1 function readNum(){ 2 var num=10; 3 function alNum(){ 4 alert(num); 5 } 6 return alNum; 7 } 8 9 var useAl=alNum; 10 useAl();
這一點和C語言等語言很類似,就第二個函數屬於第一個函數內部,對於第二個函數來講,num這個變量是相對於他全局的,所以可以訪問這個變量,所以這個程序輸出的值是10,這一點沒有問題。那么當我們要訪問這個變量的時候就可以將alNum作為返回值來用。這樣我們就實現了在外部使用num變量。
那么!這里的alNum函數就是閉包!然后就是閉包就是使用一個內部函數來給外部一個借口訪問內部局部變量,還可以這么理解,就是定義在函數內部的函數,這個函數可以訪問到內部的局部變量。