指有權訪問另乙個函式作用域中的變數的函式
要理解閉包就必須要了解作用域鏈
後台的每個執行環境都有乙個表示變數的物件--變數物件。全部變數物件始終都存在
而像compare()函式這樣的區域性環境的變數物件,則只在函式執行的過程中存在
在建立compare()函式的時候,會建立乙個預先包括全域性變數物件的作用域鏈,這個作用域鏈被儲存在內部的【【scope】】屬性中
呼叫compare()函式的時候,會為函式建立乙個執行環境,然後通過複製函式的【【scope】】屬性中的物件構建起執行環境的作用域鏈。
此後,又有乙個活動物件(在此作為變數物件使用)被建立並被推入執行韓晶作用域鏈的前端。對於這個例子中的conpare()函式的執行環境而言,
其作用域鏈中包含兩個變數物件:本地活動物件和全域性變數物件。顯然,作用域鏈本質上是乙個指向變數物件的指標列表,它只引用但不包含變數物件
上面一直提到呼叫乙個函式,會建立乙個執行環境,那麼什麼是執行環境??
概念:執行環境(環境)是js中重要的乙個概念,執行環境定義了變數或函式有權訪問的其他資料,決定他們的各自行為。
概念詳解:每個執行環境都有乙個與之關聯的變數物件,環境中定義的函式和變數都儲存在這個物件中,我們無法訪問這個物件
全域性執行環境:全域性執行環境是最外圍的乙個執行環境。web瀏覽器中全域性執行環境被認為window。因為所有全域性變數和函式都是作為window物件的屬性和方法建立的。
環境執行完畢:某個執行環境中的所有**執行完畢後,該環境被銷毀,儲存在其中的所有變數和函式定義隨之銷毀(全域性環境知道應用程式推出,關閉網頁和瀏覽器時才銷毀)
執行流機制:每個函式都有自己的執行環境。當執行流進入乙個函式的時候,函式的環境被推入乙個環境棧中。而在函式執行之後,棧將其環境彈出,把控制權返回給之前
的執行環境,
作用域鏈:
是保證對執行環境有權訪問的所有變數和函式有序訪問
**執行:
當**在乙個執行環境中執行時,會建立變數物件的乙個作用域鏈。作用域鏈的作用:是保證對執行環境有權訪問的所有變數和函式有序訪問
作用域的前端,始終都是當前執行**所在環境的變數物件。如果這個環境是函式,則將其活動物件作為變數物件。活動物件最開始的時候只包含乙個變數
:arguments物件(這個物件在全域性環境中是不存在的)。作用域鏈中的下乙個變數物件來自包含(外部)環境。而再下乙個變數物件來自於下乙個包含環境,
這樣,一直延續到全域性的執行環境。識別符號解析是沿著作用域一級一級向後搜尋(沒找到會導致報錯)
var scope = "全域性執行環境"function
swapscope()
//這裡可以訪問 scope anotherscope 不能訪問 tempscope
}
//這裡只能訪問scope
//以上**涉及三個執行環境:全域性執行環境,swapscope()的區域性環境
和changescope區域性環境
對於changescope函式而言,其作用域中包含三個物件:全域性變數物件,changescope的變數物件和swapscope的變數物件。
消除全域性變數
var c = function() let b = 0
return
function
() }
c()//
其中不僅初始化了b的值,而且在後來呼叫的時候不用重複使用let b = 0,而且還儲存了a物件
上面就是利用了閉包有權訪問另乙個函式作用域中的變數的函式。匿名函式訪問了c函式中的a物件
和b變數的值。
上面面臨兩個問題
匿名函式 = null
將匿名函式設定為null,解除該函式的引用。就等於通知垃圾**例程將其清除。隨著匿名函式的
作用域鏈被銷毀。其他作用域鏈也可以安全銷毀。其的包含的函式也就可以隨之銷毀變數物件
const a = function()
var c = new
array()
for (var i = 0; i < 5; i++)
}returnc}
//返回的陣列都是5
const a = function()
var c = new
array()
for (var i = 0; i < 5; i++) (i))
}return
c}
一段程式**中所用到的名字並不總是有效/可用的,而限定這個名字的可用性的**範圍就是這個名字的作用域。」
作用域 閉包
1.js執行順序 語法分析 預編譯 先生成go物件 1.函式執行生成ao物件 2.形參和變數作為ao物件的鍵名,鍵值是undefined 3.實參賦值給形參 4.在函式中找到函式宣告,把函式作為ao物件的屬性名,屬性值為函式體 執行js 作用域 變數作用範圍 1.作用域 變數作用範圍 1 函式作用域...
作用域,閉包,作用域鏈
一,作用域 變數在宣告它的函式及該函式所巢狀的任意函式是有定義的 例var num 2 function fun fun 二,作用域鏈 多個函式巢狀在一起,多個作用域相互巢狀,這是作用域鏈 var num 1 function fun function fun2 fun1 fun2 fun 訪問原則...
作用域 作用域鏈 閉包
閉包概念中的一些專業名詞概念不清晰 作用域鏈 本質是乙個指向變數物件的指標列表。函式的作用域鏈在函式呼叫完成後即被銷毀。變數物件 全域性變數物件 js執行時一直存在 活動變數物件 區域性變數物件,函式執行完畢後銷毀 函式在呼叫時建立本地的活動物件加上函式定義時預建立的作用域鏈,形成乙個新的用於執行函...