一文讀懂非同步在for迴圈下的不同表現

2021-09-12 16:23:47 字數 1384 閱讀 2674

// var出的變數是函式級作用域,

// 作用範圍是在函式開始階段和函式執行完成之前內都是存在的;並且如果該函式內部還存在匿名函式等特殊函式,這個var出的變數在匿名函式中任然可以用;

// let出的變數作用域是 塊作用域,在離開某一**塊,該變數就會被銷毀不存在.

//這段**的步驟簡述

//1.先for迴圈,當遇到settimeout時,因為for迴圈時同步的,settimeouts屬於非同步,

// 非同步簡單說就是同步都執行好了,才執行非同步佇列

//2.於是for迴圈一直到9,迴圈期間生成了十個任務佇列,也就是十個定時器,

// 此時的十個定時器裡的i,指向全域性變數i,也就是說,for迴圈i=0時,settiemout傳入的i確實是0;因為就乙個全域性變數i

// 但是當for迴圈i=1時,上乙個for迴圈i=0的settimeout的i==0,又跟著變成1,原因還是因為就乙個全域性變數

//迴圈到9時,(var i = 9; 9 <10; 9++)此時生成了十個任務佇列(0-9)

////4.這個時候var i = 10; 10 <10; 於是下面的**不再執行,也就是說說for迴圈同步結束時,i==10

//迴圈結束,開始執行非同步也就是settimeout

//ps:為什麼這個時候還能獲取到i==10呢;因為

//var的變數是函式級作用域,作用範圍是在函式開始階段和函式執行完成之前內都是存在的;

//所以最後就是彈出(0-9)10個10

for (var i = 0; i <10; i++) , 0);

}//10 10 10 10 10 10 10 10 10 10

//for迴圈有乙個特別之處,就是設定迴圈變數那部分是乙個父級作用域,而迴圈體內部是乙個單獨的子作用域

//1.先for迴圈,此時會建立乙個塊級作用域。裡面的i=0;於是settiemout傳入的i是0,生成乙個任務佇列

// let 宣告不會被提公升到當前執行上下文的頂部,let宣告的變數只在它所在的**塊有效,

// 也就是說不會像for迴圈那樣只有乙個全域性變數i,而是會生成10個i

迴圈一直到9,期間i的值一直都在變化,所以傳入的值都不一樣

//因為每次迴圈都會建立乙個塊級作用域,並且存上i的值(0-9),當前的i只在本輪迴圈有效,所以i++後每一次迴圈的i其實都是乙個新的變數

// 迴圈期間生成了十個定時器存入任務佇列,此時的十個定時器裡的i,指向i++後不同的i,

//3.非同步的settimeout開始執行,因為之前傳入了i。所以此時就彈出0 1 2 3 4 5 6 7 8 9

for (let i = 0; i <10; i++) , 1000);

}// //0 1 2 3 4 5 6 7 8 9

一文讀懂linux 下zram

本文 zram 技術的由來 3.15 之前版本的 kernel device drivers staging drivers staging y 3.15 及之後版本的 kernel device drivers block devices compressed ram block device s...

一文讀懂指標的本質

在前面的話 不得不說,看了太多的人在各種地方討論指標 越發看下去,越發覺得簡單的事情被搞那麼複雜,真是夠了,求求你們,放開那個變數,讓我來!正文 1 從變數的三要素開始談起 為了把複雜的事情說簡單,我們拋開指標先從變數談起。好吧,不知道這個笑話是不是夠冷 乙個變數 variable 或者順便相容下物...

一文讀懂矩陣的特徵分解

矩陣的特徵分解非常好理解,假設現在有乙個nxn的矩陣a,如果這個矩陣a有n個線性無關的特徵向量,那麼a就可以分解為 p代表nxn的方陣,中間的 代表對角矩陣 怎麼理解呢?為什麼可以分解成這樣呢?對角矩陣 對角矩陣是指只有主對角線上含有非零元素的矩陣,一般記作 例如 矩陣相似 若矩陣a和矩陣b都是n階...