Js中的作用域和作用域鏈
前言
-
閱讀本文,請先閱讀:Js中的函式相關:創建函式的三種方式、函式的形參和實參、回傳值、return、break、continue的區別、多載和arguments、匿名函式、回呼函式
-
閱讀本文,請千萬不要閱讀:Js中面向物件的三大特點:封裝、繼承、多型
1. 作用域
1.1 定義:
作用域是一個變數的可用范圍,作用域的本質是一個保存變數的物件,作用域避免了不同范圍內的資料的相互干擾,
1.2. Js中的作用域分為2級:
(1). 全域作用域:window物件
i. 專門保存所有全域變數的物件,
ii. 優點:隨處可用,可以反復使用,
iii. 缺點:極易被污染,
(2). 函式作用域:函式作用域物件
i.專門保存函式內可用的區域變數的作用域,
ii. 優點:因為僅函式內可用,所以不會被污染,
iii. 缺點:不可以重復使用,
1.3函式的生命周期
一個函式從創建到呼叫,最后呼叫完所經歷的階段就是一個函式的生命周期,
(1). 定義函式時
i. 創建函式物件
ii. 創建函式名變數,保存函式的地址
iii. 每一個函式都有一個與之關聯的物件串列或者鏈表,這個串列有兩級
a. 離函式近的一級,暫時空著
b. 離函式遠的一級,保存window物件的參考
函式在將來呼叫時,萬一缺少變數,從window中查找變數使用,
(2). 呼叫函式時
i. 臨時創建本次函式呼叫的函式作用域物件,
ii. 在函式作用域物件中創建本次函式所需的所有區域變數,
a. 在函式內var 出的變數是區域變數,
b.形參變數雖然沒有var,但是也屬于區域變數,
iii. 函式中離自己近的一級作用域串列,會立刻參考函式作用域物件,
iiii. 函式執行程序,變數的使用順序:
a. 先區域,
b. 區域沒有,才全域,
(3). 函式呼叫后
i. 釋放函式作用域物件,
ii. 導致函式作用于物件中的區域變數也跟著釋放 ,
iii. 所以區域變數都不可重用,

1.4. 作用域鏈
i. 作用域鏈是由多級作用域串聯形成的鏈式結構
ii. 每個函式在創建時,就有了自己的作用域鏈,
普通函式的作用域鏈包含兩級,
離自己近的一級,暫時為空,呼叫函式時,用來臨時參考函式作用域物件,
離自己遠的一級,始終保存著全域作用域物件window
iii. 作用域鏈保存著一個函式可用的全部變數
iiii.控制著變數的使用順序:先區域,區域沒有,才全域
1.5. Js中沒有塊級作用域
i. 除函式以外的回圈和分支的{},稱為程式塊
ii. Java語言中回圈和分支結構的{}也是一級作用域,回圈和分支結構內var的變數,出了{},不能使用,
iii. Js語言中回圈和分支結構的{}不是作用域,回圈和分支結構內var的變數,出了{},仍然可以使用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/16762.html
標籤:java
