我閱讀了關于const, let, 的MDN 頁面var。的,所述概述之前ES2015我們只有global scope和function scope。在[這個MDN頁] [1]存在的塊范圍的好處的例子; 這表明:而不是使用閉包概念來保存函式的相關資料,例如 for 回圈迭代次數,將回圈變數定義為let。如果let關鍵字僅用于塊作用域,如何為我們提供此功能?其他編程語言有這個概念嗎?
let divClassX = document.querySelectorAll('.x');
for (let j = 0; j < 2; j ) {
divClassX[j].onclick = function (event) {
console.log('class x div\'s x ' j)
}
}
上面的代碼具有相同的功能:
let divClassX = document.querySelectorAll('.x');
for (var j = 0; j < 2; j ) {
divClassX[j].onclick = (function (j) {
return function (event) {
console.log('class x div\'s x ' j)
}
})(j)
}
我假設存在一些類似的功能,因此打擊代碼必須像上面一樣作業,但是當我兩次單擊 div1 或 div2 時,我都得到 2,但是當我單擊 div 1 時預計會得到一個,而當我單擊 div2 時會得到兩個。
let div1 = document.querySelector('#div1');
let div2 = document.querySelector('#div2');
let i = 1;
div1.onclick = function (event) {
console.log(i);
}
i = i 1;
div2.onclick = function (event) {
console.log(i);
}
什么概念存在我不知道?[1]:https : //developer.mozilla.org/en-US/docs/Glossary/IIFE
uj5u.com熱心網友回復:
這叫做閉包。
閉包是捆綁在一起(封閉)的函式與其周圍狀態(詞法環境)的參考的組合。換句話說,閉包使您可以從內部函式訪問外部函式的作用域。在 JavaScript 中,每次創建函式時都會在創建函式時創建閉包。
在你的最后一個片段中
console.log(i);
不列印副本,而是列印實際變數i(參考),用
let i = 1;
并修改為
i = i 1;
uj5u.com熱心網友回復:
更多的是關于變數定義的范圍,而不是修改它的順序。
在您的最后一個示例中,let i發生在全域范圍內。function您創建的每個事件偵聽器都會創建自己的作用域,其父作用域是全域作用域。i函式創建時的值是什么并不重要,重要的是作用域鏈的結構。JavaScript 在越來越大的作用域中查找變數,沿著父作用域的“鏈”向上。對于這兩個函式,i在呼叫函式時訪問時將決議為全域范圍,而不是在創建函式時。
至于 for 回圈let,我相信for 的部分設計目標let是使回圈/事件處理程式(或其他嵌套函式)的行為更加直觀,并提供一種簡單的方法來避免每個事件處理程式參考as的最后一個值的常見問題i與創建函式時的值相反(即在回圈的每次迭代中)。
換句話說,在 ES2015中,回圈的每次迭代都有一個單獨的作用域,let并將變數分配給該作用域,而不是function像var. 此外,當呼叫嵌套函式(for回圈內的函式)時,它會在查找作用域鏈時首先命中“迭代”作用域,因此它會看到i迭代時的狀態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/370594.html
標籤:javascript 让
