在我的代碼中,我創建了使用通過關鍵字i宣告的回圈中的變數的按鈕。var現在每個按鈕將記錄 10,即變數的最后一個值。問題是,處理程式中的變數來自哪里?他是從主范圍中拾取它的嗎?在 的情況下let,創建了 9 個作用域,并且處理程式在單擊時從每個作用域訪問 i?我一直認為處理程式會記住i回圈的每一步
<html>
<head></head>
<body>
<h1>test</h1>
<script>
const start = () => {
const body = document.querySelector('body');
for (var i = 1; i < 10; i ) {
const button = document.createElement('button');
button.onclick = function() {
console.log(i);
}
console.log(i)
body.appendChild(button);
}
}
start();
</script>
</body>
</html>
uj5u.com熱心網友回復:
在 Javascript 中,變數是參考型別的。所以在 for 回圈范圍內只有一個i. 并且每次迭代都會增加。這就是為什么每個按鈕都會列印最后一個值的原因。
uj5u.com熱心網友回復:
簡單的答案是由于范圍和閉包。用 var 定義的變數是函式范圍的,因為 onClick 是一個函式,所以閉包開始發揮作用,在回圈結束時,閉包的值為 10。
用 let 定義的變數是塊范圍的,因此為每個回圈創建一個值為 1 的新范圍。
uj5u.com熱心網友回復:
這是由'var'的函式范圍引起的經典js問題。從 ES6 開始,通過 'let' 和 'const' 解決了這個問題,因為它們具有塊作用域(每個 {} 為通過 'let' 和 'const' 創建的變數創建作用域)。如果您將迭代器宣告從“var”更改為“讓”,它將按預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/483696.html
標籤:javascript 范围
