變數作用域和作用域鏈和閉包簡介

2021-10-01 07:39:07 字數 1902 閱讀 8187

變數往作用域中儲存資料

因為變數需要執行環境 ; 就是作用域

1:全域性作用域在瀏覽器或者程式剛開始執行時產生

2:全域性作用域銷毀:在關閉瀏覽器或關閉程式時

所以:我們宣告的全域性變數; 都是window 物件下的屬性

所以:js 中所有資料都在window下活躍

所以: 全域性作用域下最大的物件就是window 每次改變變數值,都是給window 屬性重新賦值

window 屬性為宣告變數 或定義函式名子

變數和函式如何成為window 下屬性

因為js 執行要三個階段

1:語言分析

2: 預編譯

2.1: 在全域性作用域形成之初,預編譯會建立go物件:也是全域性

2.2:先將所有變數提公升: 提公升到作用域最頂端,賦值為undefined

2.3:2.3在將所有定義的函式,提公升到作用域的頂端,並賦值為函式在堆中的指標

注意:變數宣告先提公升;然後函式定義在提公升.所用的變數用值;都是使用最近的一次賦值

----》所以經過預編譯後;變數和函式名字就成為了window的屬性

3:解析執行

每執行一行**:都會對window 下的屬性進行重新賦值—》也就是資料發生的變化

作用域分類

全域性作用域:

window物件下

是最大的作用域

其他作用域都必須在全域性作用下

區域性作用域:

因為函式體中有宣告的變數,函式在執行的時候:該變數執行需要乙個環境:所以就產生了區域性作用域

當函式執行完畢時,看子作用域中是否有需要使用他宣告的變數;如果沒有則作用域銷毀;變數消失(實際為變數賦值為null),如果用到了,那麼就形成了閉包,作用域儲存下來

函式執行環境;是在棧記憶體中,每此執行都會開闢乙個空間,執行完畢消失

所以 每個作用域中都有體格最大的物件,區域性作用域為ao物件 全域性為go

每個都有隱藏this ,預設指向該物件。

塊級作用域

let 宣告的變數{} 時乙個**塊; let 只能在自己的{}內部執行,外部不能訪問,只看{}不看函式

2:塊級作用域頁遵循作用域鏈規則, 小作用域可以使用大作用域的資料

3:for 迴圈中let 千萬注意 不是乙個塊級域

for

(let i =

0; i<

3;i++),

1000)}

for(

var i =

0; i<

3;i++),

1000

)}

預編譯

1: 建立ao物件 ao:{}

2: 將函式體中宣告的變數提公升到作用域頂端, 給ao新增屬性, 賦值為undefined

3:將函式體中函式提公升到作用域頂端,給ao新增屬性,屬性為函式名;值為定義函式的指標

解析執行

1:每執行一行對ao中屬性重新賦值

2: 如果未經宣告

作用域鏈[scope]

var a=

1functionb(

)b()

// 如果沒有作用域鏈返回 a is not defined

// 有就返回 1

鏈式關係,大作用域巢狀小作用域,作用域的層層巢狀形成作用域鏈
this 預設就是存在的,每個作用域都有,預設指向當前作用域中的物件【抽象的物件】

1: 函式中作用域是不穩定的

2: 作用域可以賦值給物件

3:物件.函式執行, 可以將tnis 賦值給物件 誰呼叫指向誰

function()

var a =

newcreatobj

;// this 指向 a物件

作用域,閉包,作用域鏈

一,作用域 變數在宣告它的函式及該函式所巢狀的任意函式是有定義的 例var num 2 function fun fun 二,作用域鏈 多個函式巢狀在一起,多個作用域相互巢狀,這是作用域鏈 var num 1 function fun function fun2 fun1 fun2 fun 訪問原則...

作用域 作用域鏈 閉包

閉包概念中的一些專業名詞概念不清晰 作用域鏈 本質是乙個指向變數物件的指標列表。函式的作用域鏈在函式呼叫完成後即被銷毀。變數物件 全域性變數物件 js執行時一直存在 活動變數物件 區域性變數物件,函式執行完畢後銷毀 函式在呼叫時建立本地的活動物件加上函式定義時預建立的作用域鏈,形成乙個新的用於執行函...

作用域鏈和閉包

一.作用域鏈 scope chain 1.作用域 函式作用域 scope 外部對內部可見 內部對外部不可見 內部優先 js中只有函式級別的作用域,沒有塊級別的作用域 換句話說,只有在進入或者退出函式的時候,作用域會發生變化 2.執行環境 ec 和作用域鏈 執行環境,定義了執行期間可以訪問的變數和函式...