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,
]
}
上面這個例子只是返回了一個閉包函數,就調用了一次函數