例一:
執行結果是66666for
(var i=
1; i<=
5; i++
), i*
1000);
}
例二:
執行結果是12345for
(let i=
1; i<=
5; i++
), i*
1000);
}
我在網上找到很多關於這個例子的講解,第乙個例子很容易(就是settimeout是非同步執行的,當延時顯示時,迴圈體早就結束了,i=6所以輸出的全是6),至於第二個例子我也看了很多講解就是沒弄懂。但是恕我愚笨,他們有的講的太抽象,有的就根本沒講到真正的點上。
因此我打算自己通過拆解迴圈的方法來幫大家分析一下。
首先,拆解例一
不難看出function timer()定義時,內部(括號裡面)不包含i這個變數,那麼延時結束後它就會到外層去找(大括號為界限),而外層的i此時已經為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++;
下面拆解例二:
這裡在迴圈每次執行都會生成乙個塊級作用域,並將迴圈引數傳給該塊級作用域作為引數。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的區別...