js 中的閉包

#### 先理解 js 中的執行環境(https://www.jianshu.com/p/5e5...
閉包 按中文的意思就是關上一個包的意思。若是咱們把函數的變量對象當作是一個包的話,那這個詞很形象體現了它的做用 。函數被調用時會建立它的執行環境,函數語句執行完後程序會自動銷燬這個函數的執行環境,可是當一個函數中聲明瞭另外一個函數(子函數),而且若是存在對這個子函數引用,就會造成閉包,形象點說就至關於把父函數的活動對象(其實就是變量對象,只是它是執行時的變量對象)給關閉了起來,不讓程序去銷燬它(用技術語言就是父函數的活動對象會儲存在內存中,知道手動的解除這個引用)。例如:閉包

function a() {
    var name = "xuxu";
    function b() {
        console.log(name);
    }
    // 此處產生閉包 
    b();
} 
a();

當函數能夠記住並訪問它所在的做用域鏈時,就產生了閉包 固然,大部分的閉包都不是這麼直觀的,由於子函數的調用是能夠在父函數以外的,例如:函數

function a() {
    var name = "xuxu";
    function b() {
        console.log(name);
    }
    return b;
} 
var c=a();
// 此處產生閉包 此處的c函數其實就是a函數
c();

經過以上代碼,咱們也能夠看出一個閉包的好處,就是咱們再全局做用域(此處是widow)下訪問到了局部做用域(a函數)的做用域的值,按正常的詞法做用域是沒法這麼作的,可是當咱們使用閉包是就能夠了。而後咱們再看一點咱們平時寫的比較多的:code

function foo() {
    var a = 2;
    function baz() {
          // 2
        console.log( a ); 
    }
    bar( baz );
}
function bar(fn) {
// 你們快看呀,這就是閉包!
    fn(); 
}

又或者對象

var fn;
function foo() {
    var a = 2;
    function baz() {
        console.log( a );
    }
    // 將baz分配給全局變量
    fn = baz; 
}
function bar() {
     // 你們快看呀,這就是閉包!
    fn();
}
foo();
// 2
bar();

以上也是閉包,所以在函數內部調用子函數,或者經過何種手段將內部函數傳遞到所在的詞法做用域之外,它都會持有對原始定義做用域的引用,不管在何處執行這個函數都會使用閉包 你們理解了木有哇~內存

相關文章
相關標籤/搜索