1.理解閉包咱們首先要了解做用域的問題,簡單瞭解一下做用域,以下做用域的一些結論:閉包
1 函數纔會造成做用域 2 JavaScript的做用域是詞法做用域 3 詞法做用域:變量(變量和函數)的做用範圍 在代碼寫出來的就已經決定, 與運行時無關 4 函數內部能夠訪問函數外部的變量(函數外部不能訪問函數內部的變量) 5 變量搜索原則:從當前鏈開始查找直到0級鏈,從高到低查找 當定義了一個函數,當前的做用域鏈就保存起來,而且成爲函數的內部狀態的一部分。
閉包從字面上看就是封閉和包裹, 在函數中定義的變量在函數外部沒法訪問, 所以這個函數就構成閉包。 > 閉包是一個受保護的變量空間。 閉包包括:函數 以及 建立該函數的環境(做用域鏈)
3.閉包代碼搶先看:函數
function foo() { var num = 0; return function() { return num++; };} var getNum = foo();console.log(getNum());
4.要解決閉包的什麼問題(目標)?spa
想辦法(在外部)訪問到函數內部的數據對象
獲取函數內部數據ip
函數內部的數據,在函數外面訪問不到。作用域
函數對其內部的數據有一個保護的做用。get
5.利用函數返回值io
function foo() { var num = 123; return num;} var num1 = foo();
var num1 = foo();var num2 = foo();console.log(num1 === num2); // true
function foo() { var obj = {num: 123}; return obj;} var o1 = foo();var o2 = foo();console.log(o1 === o2); // false
6.普通的函數返回值說明console
兩次調用函數,返回的數據並非同一個數據。 出現這個緣由是:函數在每次調用的時候,函數內部的數據會被新建立一次 要解決這個問題, 只須要保證, 函數 foo 只調用一次便可。
7.閉包模型function
function foo() { var str = "BOSS"; return function() { return str; };} // 調用var f = foo();var str1 = f();var str2 = f();console.log(str1 === str2);
在函數(outer)內部定義的函數(inner),執行的時候能夠訪問到上一級做用域中的變量。 所以,在函數(outer)外部,就能夠間接訪問到函數(outer)中的數據了。