在javascript中閉包應該是最難理解的一部分內容。在我看來閉包就是和作用域之間的聯系。
1、首先我們來了解一下javascript中的作用域知識。
javascript中的作用域其實就指的函數作用域,因為只有函數在javascript中才能形成區域范圍。而函數作用域有一下特點。
1.1 函數能訪問到外部的變量。案例一:
var num = 123; function fn() { console.log(num);//輸出的值為123 } fn();
1.2 函數內的變量不能被外部訪問到。案例二:
function fn(){ var num=123; } console.log(num)//輸出值:num is not undefined說明函數內部的變量是不能被外邊訪問的。
2、下面就該說閉包了
從上面案例二我可以知道函數會形成一個封閉的區域,對其中的變量起到保護作用,使函數外邊無法訪問。
閉包:從字面意思來理解就是封閉和包裹,換句話說,就是在函數內部定義的變量,在函數的外部無法訪問到,因此就說函數構成了一個閉包。
說白了閉包是作用域的應用。
計算機科學中對閉包的定義為:一個函數的函數體以及函數所處的環境,構成的一個綜合體叫做:閉包
函數體:就是函數內部的代碼。
函數所處的環境:指的就是作用域。
是不是覺得計算機科學中對閉包的定義是不是很難理解。
3、使用閉包來解決什么樣的問題?
我使用閉包來解決如何訪問函數內部變量的問題。 下面我寫個史上最簡單的閉包。
function foo() { var num = 123; function fn() { return num;// } return fn; } var m=foo(); var f=m(); console.log(f);//輸出的值為123,這樣就可以訪問到函數內部變量num。 原理就是利用閉包:在函數foo中嵌套了一個函數fn,利用函數fn可以訪問到其外部的變量,而獲取函數foo中的變量num,當外部調用函數foo()時候, 函數foo中 return返回fn函數的實體,然后我再對函數fn進行調用就在外部訪問到函數內部變量num了。就是利用內部函數的閉包特性把函數foo中的變量取到外邊, 說白了內部函數就相當於一個媒介,就是一個橋梁連接函數內部和外部。這就是閉包作用。