什麼是閉包,為什麼要用他?閉包是能夠訪問其他函數作用域的函數。我們來分析下句子成分(語文大神),閉包是函數,js函數的作用域分為全局作用域,局部作用域,eval作用域,並沒有塊級作用域形象的講,每個函數都是一個小黑屋,能在小黑屋裡看到外面的的世界,可是外界不知道小黑屋裡是啥情況,如何打開門從小黑屋出... ...
什麼是閉包,為什麼要用他?
閉包是能夠訪問其他函數作用域的函數。
我們來分析下句子成分(語文大神),閉包是函數,js函數的作用域分為全局作用域,局部作用域,eval作用域,並沒有塊級作用域形象的講,每個函數都是一個小黑屋,能在小黑屋裡看到外面的的世界,可是外界不知道小黑屋裡是啥情況,如何打開門從小黑屋出來呢,就用到了閉包。
有幾個概念必須要瞭解
作用域和作用域鏈
原來作用域和上下文作用域是兩個不同的概念,本質上來說,作用域是基於函數的,上下文是基於對象的,作用域規定了當前執行環境對變數的訪問許可權,這是js中最重要一個概念。
作用域鏈(詞法作用域):當查找變數的時候,會先從變數本身查起,如果本身沒有就從父級對象上查找,一直查到全局上下文變數對象,若無返回undefine,這個由多個執行上下文對象構成的鏈表就叫做作用域鏈。
閉包的特點:
1、函數內再嵌套函數
2、內部函數可以引用外層的參數和變數。
3、參數和變數不會被垃圾回收機制回收
閉包的使用註意事項
函數會使得函數中的變數保存在記憶體中,會占用記憶體,所以只有在必要的時候使用它,如果不用的話要將他為null
MMP Show Me The Code
function example(){
var n=1;
function example2(){
alert(n);
};
return example2;
}
var result=example(); result(); // 1
在自己函數內部定義一個函數,然後再將函數值return回去
function example1(){
var n=1;
Add = function() { n+=1 }
function example2(){
alert(n);
}
return example2;
}
var result=example1(); result(); // 1 Add(); result(); // 2
解析:result();
函數定義了一個變數 ,調用時直接返回一個函數,example2裡面沒有n,沿著作用域鏈向上找到了n=1;
Add();執行後n的值為2;
然後example2向上查找時n就變成了2;
小結:整理了一下午,到處查資料,原來探究越深才知道知道的越少,這些東西很重要,檢驗你是否學好可以試著給別人講懂。
由於自身能力有限,有些錯誤在所難免,歡迎指正,榮幸之至。