JavaScript-閉包函數(理解)


JavaScript-閉包函數(理解)

var foo = function (a) {
    return function inner  ()  {
        console.log(a)
    }
}


var faa = foo(1)

/*
fooContext = {
    variableObejct:{
        inner:[對函數聲明inner的引用]
	    arg:1
    }
    this: thisValue,
    Scope:[
    	 globalContext.variableObject   // 就是全局變量
    ]
}

innerContext = {
    variableObejct:{
    }
    this: thisValue,
    Scope:[
    	 fooContext.variableObject      // foo的變量
    	 globalContext.variableObject   // 就是全局變量
    ]
}

這是你原文的一段話:
實際上,foo函數調用結束后, foo函數的變量對象並不會被立即銷毀,而是只有當取得foo函數閉包的值的foo1, foo2, foo3調用結束, 這三個函數的變量對象和作用域鏈被銷毀后, foo函數才算“完成任務”,這時,它才能被銷毀。

我是不是可以這樣理解:
innerContext中的Scope里還有對 fooContext.variableObject 的引用吧,所以此時foo是不會刪除的,只有當inner這個閉包函數被調用完之后,inner這個作用域被刪除之后,fooContext.variableObject沒有其他被引用了,這時也就會刪除掉foo的作用域

*/

關於閉包先了解函數執行環境,作用域鏈以及變量對象

在函數調用的時候,會創建一個函數的執行環境,這個執行環境有一個與之對象的變量對象和作用域鏈

ExecutionContext = {
    variableObject: { .... },
    this: thisValue,
    Scope: [ // Scope chain
      // 所有變量對象的列表     ]
};

變量對象和作用域鏈

var foo = function (a) {
    var name = "zhuyu"
    var inner = function () {
        console.log(a)
    }
    return inner
}

foo(222)

// 上面這個函數調用的時候,它的執行環境的變量對象就是variableObject里的數據
// 它的作用域鏈就是Scope里的數據
fooexectionContext = {
    variableObject:{
        name:"zhuyu",
        inner:[函數inner的引用],
        arg:222
    }
    Scope:[
        fooexectionContext.variableObject,
        gobleExectionContext.variableObjet,
    ]
}

上面這個例子只是返回了一個閉包函數,就調用了一次函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM