乙個經典的塊級作用域例子拆解

2021-10-21 15:18:35 字數 1424 閱讀 4791

例一:

for

(var i=

1; i<=

5; i++

), i*

1000);

}

執行結果是66666

例二:

for

(let i=

1; i<=

5; i++

), i*

1000);

}

執行結果是12345

我在網上找到很多關於這個例子的講解,第乙個例子很容易(就是settimeout是非同步執行的,當延時顯示時,迴圈體早就結束了,i=6所以輸出的全是6),至於第二個例子我也看了很多講解就是沒弄懂。但是恕我愚笨,他們有的講的太抽象,有的就根本沒講到真正的點上。

因此我打算自己通過拆解迴圈的方法來幫大家分析一下。

首先,拆解例一

var i=1;

settimeout

(function

timer()

, i*

1000);

i++;

settimeout

(function

timer()

, i*

1000);

i++;

settimeout

(function

timer()

, i*

1000);

i++;

settimeout

(function

timer()

, i*

1000);

i++;

settimeout

(function

timer()

, i*

1000);

i++;

不難看出function timer()定義時,內部(括號裡面)不包含i這個變數,那麼延時結束後它就會到外層去找(大括號為界限),而外層的i此時已經為6。

下面拆解例二:

let j =1;

, i*

1000);

}j++

;, i*

1000);

}j++

;, i*

1000);

}j++

;, i*

1000);

}j++

;, i*

1000);

}j++

;

這裡在迴圈每次執行都會生成乙個塊級作用域,並將迴圈引數傳給該塊級作用域作為引數。

這裡之所以用 j 來代原本替迴圈體內的 i 是因為let不可以重複定義同名變數。

大家可以複製**到瀏覽器控制台執行一下來驗證。

如果這還看不懂,那麼你得好好回去補一補作用域的知識了,可以的話把閉包也補補

全域性作用域 函式作用域 塊級作用域的理解

作用域是任何一門程式語言中的重中之重,因為它控制著變數與引數的可見性與生命週期。很慚愧,我今天才深入理解js的作用域.我不配做乙個程式設計師.開玩笑,什麼時候理解都不晚,重要的是理解了以後能不能深深地扎在記憶裡,不能,那就寫下來在乙個 塊 括在一對花括號中的一組語句 中定義的所有變數在 塊的外部是不...

乙個關於JS作用域鏈的例子

乙個關於js作用域鏈的例子,如下 1 var x 10 function foo function 執行結果 2 var x 10 function foo function 執行結果 簡單分析 兩段 唯一的區別是第6行,即匿名函式中對變數x的賦值。1,var x 20,2,x 20。在函式建立時,...

一 塊級作用域繫結let const var

1 變數提公升機制 無論在哪宣告,都會被當成在當前作用域頂部宣告的變數,這種機制在很多時候會產生問題。2 如果是在全域性作用域中宣告,會被繫結到window屬性中,示例如下 var a 1 console.log a,window.a 輸出1 1 3 同一變數可重複宣告。1 let和const的區別...